Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Шурик, особо другие функции не проверял и код не буду выкладывать, потому как помарка незначительная, сами поправите. Я же уже обращал на это внимание, но вы видимо как-то пропустили. В функции TotalProfit(), после выбора ордера должно стоять или (||).
Я Вам бесконечно благодарен, именно после этого изменения все заработало, Спасибо!!!
Всем привет!
Возможно-ли рассчитать в советнике стоимость одного пункта, если счет будет открыт в рублях?
Всем привет!
Возможно-ли рассчитать в советнике стоимость одного пункта, если счет будет открыт в рублях?
Точно не знаю, у самого как-то не возникало необходимости, но похоже надо смотреть справку по функции MarketInfo и вероятно то что вам нужно, это:
MarketInfo(Symbol(), MODE_TICKVALUE);
Всем привет!
Возможно-ли рассчитать в советнике стоимость одного пункта, если счет будет открыт в рублях?
Точно не знаю, у самого как-то не возникало необходимости, но похоже надо смотреть справку по функции MarketInfo и вероятно то что вам нужно, это:
MarketInfo(Symbol(), MODE_TICKVALUE);
т.е. если лот*MarketInfo(Symbol(), MODE_TICKVALUE) то получится стоимость в валюте депо?
Точно не уверен, возможно нужно ещё что-то добавить. Попробуйте напишите и протестируйте.
Точно не уверен, возможно нужно ещё что-то добавить. Попробуйте напишите и протестируйте.
например: открыты несколько ордеров на покупку и несколько на продажу.
если посчитать профит отдельно для покупок и отдельно для продажи следующими функциями:
double profit_buy()
{
profit_b = 0;
for (int i=OrdersTotal()-1; i>=0;i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
profit_b += OrderProfit()+MathAbs(OrderSwap())+OrderCommission();
}
}
return (NormalizeDouble(profit_b,2));
}
//----------------------------------------------------------------------------------------------------------------------------------------------------------
double profit_sell()
{
profit_s = 0;
for (int i=OrdersTotal()-1; i>=0;i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
profit_s += OrderProfit()+MathAbs(OrderSwap())+OrderCommission();
}
}
return (NormalizeDouble(profit_s,2));
}
и задать условие, что если profit_buy()+profit_sell()>0 и использовать функцию закрытия ордеров:
void ClosePlusOrders()
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), Slippage, Blue))
{
Print ("Ордер на покупку закрыт");
}
else Print ("Ордер на покупку не закрыт");
}
if (OrderType() == OP_SELL)
{
if (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), Slippage, Red))
{
Print ("Ордер на продажу закрыт");
}
else Print ("Ордер на продажу не закрыт");
}
}
}
}
}
то все ордера будут закрыты при выполнении условия?
Добавлено: 17-10-2014 19:30:06
Точно не уверен, возможно нужно ещё что-то добавить. Попробуйте напишите и протестируйте.
пробовал, в тестере закрывает в плюс. есть сомнения, что на реале не будет закрываться в плюс, т.к. текущая стоимость пункта будет меняться в зависимости от курса доллара. так ли это?
Причём здесь стоимость пункта? если Вы закрываете суммарный профит по ордерам! тем более они залокированы. Профит может измениться только за счёт проскальзывания на закрытии.
пробовал, в тестере закрывает в плюс. есть сомнения, что на реале не будет закрываться в плюс, т.к. текущая стоимость пункта будет меняться в зависимости от курса доллара. так ли это?
Стоимость пункта используют при расчете дистанции до ТР (например) или расчете лота при известном СЛ.
А у Вас уже есть профит - ничего рассчитывать не надо - просто фиксировать.
Кстати функция MarketInfo(_Symbol,MODE_TICKVALUE) возвращает стоимость 1 минимального пункта в валюте депозита для сделки в 1 лот (стандартный лот брокера).
Причём здесь стоимость пункта? если Вы закрываете суммарный профит по ордерам! тем более они залокированы.
пробовал, в тестере закрывает в плюс. есть сомнения, что на реале не будет закрываться в плюс, т.к. текущая стоимость пункта будет меняться в зависимости от курса доллара. так ли это?
Стоимость пункта используют при расчете дистанции до ТР (например) или расчете лота при известном СЛ.
А у Вас уже есть профит - ничего рассчитывать не надо - просто фиксировать.
Кстати функция MarketInfo(_Symbol,MODE_TICKVALUE) возвращает стоимость 1 минимального пункта в валюте депозита для сделки в 1 лот (стандартный лот брокера).
так если объем (=0.01 лота) *MarketInfo(_Symbol,MODE_TICKVALUE) это разве не будет равно стоимости одного пункта (при объеме 0.01)?
Да, уж... Т.к. этот раздел - обучение, будем обучать математике:
так если объем (=0.01 лота) *MarketInfo(_Symbol,MODE_TICKVALUE) это разве не будет равно стоимости одного пункта (при объеме 0.01)?
1 лот * 1 пп = TICKVALUE, теперь умножим - 0,01 лот * 1 лот * 1 пп = 0,01 лот * TICKVALUE или проще говоря: 0,01 лот * 1 пп = 0,01 лот * TICKVALUE. Ура.
Да, уж... Т.к. этот раздел - обучение, будем обучать математике:
так если объем (=0.01 лота) *MarketInfo(_Symbol,MODE_TICKVALUE) это разве не будет равно стоимости одного пункта (при объеме 0.01)?
1 лот * 1 пп = TICKVALUE, теперь умножим - 0,01 лот * 1 лот * 1 пп = 0,01 лот * TICKVALUE или проще говоря: 0,01 лот * 1 пп = 0,01 лот * TICKVALUE. Ура.
/:) ну да.
спасибо.
Добрый день, пытаюсь создать переменную, содержащую в себе среднее значение (H-L) для n кол-ва баров
то есть:
high1 = High[ 1 ];
high2 = High[ 2 ];
high3 = High[ 3 ];
low1 = Low[ 1 ];
low2 = Low[ 2 ];
low3 = Low[ 3 ];
range1 = (high1 - low1)
range2 = (high2 - low2);
range3 = (high3 - low3);
Average = (range1 + range2 + range3)/3;
когда у нас рассматривается три бара, это еще ничего, но а если нужно 200 или 500, то как быть? x_x
Вроде нужно массив создать для range, но как суммировать значения потом...
Подскажите пожалуйста, такая переменная очень улучшает работу советника. :|
Подскажите, как прописать условие: если закрылся хоть один ордер, то закрыть все остальные. Или - если закрылись все бай, то закрыть все селл. (у меня все профиты бай на одной цене и все профиты селл тоже)??? ~x(
Вы рассматриваете вариант SMA, можно применить EMA - экспоненциальную среднюю - она менее ресурсо-требовательная.
Добрый день, пытаюсь создать переменную, содержащую в себе среднее значение (H-L) для n кол-ва баров
например: int ema_Count = 500; //баров
double kf_ema = 1.0 / ema_Count;
double ema;
если бар закрылся:
ema = kf_ema * (High[1] - Low[1]) + (1-kf_ema) * ema; //это оно и есть.
Хочу предупредить: ЕМА не сразу выдаст нужное значение, а только через 500 бар, чтоб ускорить процесс нужно при запуске эксперта всё-таки разово вычислять SMA и присваивать его в качестве начального значения для ema.
Если хотите ещё вариантов, то откройте в редакторе МТ индюк iMA - там очень грамотный код.
Самый простой способ это запоминать кол-во ордеров в другой переменной, потом после нового подсчёта сравнивать старое и новое значение и принимать решение если ордеров стало меньше. Минус этого варианта - Вы не будете знать ТР или СЛ закрыли ордер. Если это важно, то вместе со значением кол-ва ордеров надо сохранять текущий общий профит и если профит растёт и ордер закрылся, то закрывать все остальные.
Подскажите, как прописать условие: если закрылся хоть один ордер, то закрыть все остальные. Или - если закрылись все бай, то закрыть все селл. (у меня все профиты бай на одной цене и все профиты селл тоже)??? ~x(
Есть способ через контроль закрытых ордеров, он точнее, но значительно сложнее.
Изменено 18 октября, 2014 пользователем 0ll
Самый простой способ это запоминать кол-во ордеров в другой переменной, потом после нового подсчёта сравнивать старое и новое значение и принимать решение если ордеров стало меньше. Минус этого варианта - Вы не будете знать ТР или СЛ закрыли ордер. Если это важно, то вместе со значением кол-ва ордеров надо сохранять текущий общий профит и если профит растёт и ордер закрылся, то закрывать все остальные.
Есть способ через контроль закрытых ордеров, он точнее, но значительно сложнее.
а как первый вариант прописать на языке MQL? У меня есть функция подсчета рыночных ордеров, как ее сравнить с ней же но тиком раньше?
int Сколько_сейчас = ordCount();
а как первый вариант прописать на языке MQL? У меня есть функция подсчета рыночных ордеров, как ее сравнить с ней же но тиком раньше?
if (Сколько_сейчас Было_раньше = Сколько_сейчас;
А помогите разобраться с индикатором
Нашел на сайте индикатор Ozymandis (_/indikatory/7/indikator-ozymandias-borba-s-rynochnym-shumom/5792)
Там 5 буферов, с верхней и нижней линией понятно, но вот как раз основная вызывает вопросы...
Как проверять ее значение? не понятно, меняет ли центральная линия цвет или это две разные линии и как записать ее в переменную и с чем сравнивать?
Я предположил, что это две разные линии, буфера которых возвращают значения 0 или 1
bool ozy_sell = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 2,0);
bool ozy_buy = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 3,0);
Но я ошибся.
Помогите разобраться с ним, пожалуйста(индикатор в аттаче)
А помогите разобраться с индикатором
Нашел на сайте индикатор Ozymandis (_/indikatory/7/indikator-ozymandias-borba-s-rynochnym-shumom/5792)
Там 5 буферов, с верхней и нижней линией понятно, но вот как раз основная вызывает вопросы...
Как проверять ее значение? не понятно, меняет ли центральная линия цвет или это две разные линии и как записать ее в переменную и с чем сравнивать?
Я предположил, что это две разные линии, буфера которых возвращают значения 0 или 1
bool ozy_sell = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 2,0);
bool ozy_buy = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 3,0);
Но я ошибся.
Помогите разобраться с ним, пожалуйста(индикатор в аттаче)
По всей видимости Вы так и не разобрались и с верхней и нижней линиями. В Вашем варианте Вы как раз и используете 2 и 3 буферы, что для канала. Основная линия строится по значениям буферов 0 и 1, по ним же и расцветка. Замените свои 2 и 3 на 0 и 1. Проверить какому буферу соответствует та или иная линия - измените цвет (толщину, тип) линии данного буфера и смотрите где произойдут изменения. Но помните, что в моменты перехода между цветами сигнал будет в обеих буферах. Убедится в этом Вы можете открыв окно данных. Хотя, все зависит от Ваших условий. Можно использовать только один буфер - 4, у него наличие сигнала "1" - это будет селл, а пустое значение - бай.
Изменено 19 октября, 2014 пользователем mobidik
Поменял, все равно не работает... проверяю в условии если ozy_buy>0, подставлял 0, 1, 4 буфера
без условия ozy_buy>0 ордера открываются
void OnTick()
{
bool ozy_sell = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 2,0);
bool ozy_buy = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 4,0);
if (ozy_buy>0 && CountBuy() == 0 && CountSell() == 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
ticket = OrderSendX(Symbol(), OP_SELL, Lot, Bid, Slippage, 0, 0, "", Magic, 0, Red);
if (ticket > 0)
{
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModifyX(ticket, OrderOpenPrice(), SL, TP, 0);
}
}
}
Вам нужно принты ставить и смотреть в журнал. Сделайте так:
int ozyDir = (int)iCustom(_Symbol, 0, "Ozymandias", Amplitude, 4, 1);
if (ozyDir == OP_SELL && ... и далее по Вашему тексту (имхо так будет понятнее Dir - от слова "директ"-направление)
oleguitar Почему не работает - потому, что индюк не считает 0 бар.
Вам нужно принты ставить и смотреть в журнал. Сделайте так:
int ozyDir = (int)iCustom(_Symbol, 0, "Ozymandias", Amplitude, 4, 1);
if (ozyDir == OP_SELL && ... и далее по Вашему тексту (имхо так будет понятнее Dir - от слова "директ"-направление)
тогда уж дирекшн :)
Спасибо, заработало) Не думал, что буфер может содержать в себе понятия BUY и SELL, я представлял себе буфер переменной типа bool содержащей в себе 0 или 1 )
0 и 1 можно представлять по разному, например:
Не думал, что буфер может содержать в себе понятия BUY и SELL, я представлял себе буфер переменной типа bool содержащей в себе 0 или 1 )
OP_BUY 0 Покупка, OP_SELL 1 Продажа
или false 0, true 1
и ещё куча вариантов, но в данном случае нужно делать через константы свойства ордеров - нагляднее.
какой командой можно прикрутить свой шаблон к советнику?
ChartApplyTemplate
Люди, здрассте, очередной вопрос от начинающего. Хочу написать индикатор, который будет подсвечивать сетап внутренний бар. То есть, если хай и лоу бара ниже и выше (соответственно) предыдущего бара, то меняем его цвет на сигнальный. Гуру, помогите.
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем