Хочу доработать советник под себя, но чтобы это сделать нужно во многом разобраться! (многое не понимаю). Буду спрашивать по частям.
Есть код:
if(m_need_delete_buy_stop || m_need_delete_sell_stop) { int count_buy_stops=0,count_sell_stops=0; CalculateAllPendingOrders(count_buy_stops,count_sell_stops); if(m_need_delete_buy_stop) { if(count_buy_stops>0) { DeleteOrders(ORDER_TYPE_BUY_STOP); return; } else { m_need_delete_buy_stop=false; return; } } if(m_need_delete_sell_stop) { if(count_sell_stops>0) { DeleteOrders(ORDER_TYPE_SELL_STOP); return; } else { m_need_delete_sell_stop=false; return; } } }
Что он делает?
Хочу доработать советник под себя, но чтобы это сделать нужно во многом разобраться! (многое не понимаю). Буду спрашивать по частям.
Есть код:
Что он делает?
Если взведён флаг 'm_need_delete_buy_stop' ('необходимо удалить отложенные ордера buy stop') или m_need_delete_sell_stop' ('необходимо удалить отложенные ордера sell stop')
if(m_need_delete_buy_stop || m_need_delete_sell_stop)
{
приступаем к удалению.
Подсчитываем - сколь-же у нас советник разместил отложенных ордеров на данный момент:
int count_buy_stops=0,count_sell_stops=0; CalculateAllPendingOrders(count_buy_stops,count_sell_stops);
Если 'необходимо удалить отложенные ордера buy stop':
if(m_need_delete_buy_stop) { if(count_buy_stops>0) { DeleteOrders(ORDER_TYPE_BUY_STOP); return; } else { m_need_delete_buy_stop=false; return; } }
и количество размещённых buy stop больше нуля ('count_buy_stops') - удаляем их. Если же количество равно нулю - сбрасываем флаг 'm_need_delete_buy_stop'.
Аналогично поступаем если 'необходимо удалить отложенные ордера sell stop' ...
- www.metatrader5.com
Спасибо!
Еще код, который не понимаю:
//--- we work only at the time of the birth of new bar static datetime PrevBars=0; datetime time_0=iTime(m_symbol.Name(),InpWorkTimeFrame,0); if(time_0==PrevBars) return; PrevBars=time_0; if(!RefreshRates()) { PrevBars=0; return; }
Спасибо!
Еще код, который не понимаю:
Этот код делает следующее: работает только один раз - в момент рождения нового бара.
Этот код делает следующее: работает только один раз - в момент рождения нового бара.
Спасибо. Вот что я понял в итоге:
//--- we work only at the time of the birth of new bar // в статической переменной будем помнить время открытия последнего бара static datetime PrevBars=0; // текущее время (iTime - возвращает значение времени открытия бара) datetime time_0=iTime(m_symbol.Name(),InpWorkTimeFrame,0); if(time_0==PrevBars) return; // если время отличается, т.к. прошли условие if(time_0==PrevBars) // запомним время PrevBars=time_0; // если котировки не обновляли, то обнуляем время открытия последнего бара if(!RefreshRates()) { PrevBars=0; return; } // дошли до этого места - значит бар не новый
Без вашей ссылочки я бы не разобрался)
Спасибо. Вот что я понял в итоге:
Без вашей ссылочки я бы не разобрался)
Небольшая поправка. Это
// дошли до этого места - значит бар не новый
неверно. Правильно так:
// дошли до этого места - значит бар новый
Кстати сразу ниже идет код:
if(!RefreshRates() || !m_symbol.Refresh()) { PrevBars=0; return; }
Мне кажется он частично дублирует код, который обсуждали выше:
if(!RefreshRates()) { PrevBars=0; return; }
Мне кажется его можно удалить
Небольшая поправка. Это
неверно. Правильно так:
Далее код:
//--- check Freeze and Stops levels /* Type of order/position | Activation price | Check ------------------------|--------------------|-------------------------------------------- Buy Limit order | Ask | Ask-OpenPrice >= SYMBOL_TRADE_FREEZE_LEVEL Buy Stop order | Ask | OpenPrice-Ask >= SYMBOL_TRADE_FREEZE_LEVEL Sell Limit order | Bid | OpenPrice-Bid >= SYMBOL_TRADE_FREEZE_LEVEL Sell Stop order | Bid | Bid-OpenPrice >= SYMBOL_TRADE_FREEZE_LEVEL Buy position | Bid | TakeProfit-Bid >= SYMBOL_TRADE_FREEZE_LEVEL | | Bid-StopLoss >= SYMBOL_TRADE_FREEZE_LEVEL Sell position | Ask | Ask-TakeProfit >= SYMBOL_TRADE_FREEZE_LEVEL | | StopLoss-Ask >= SYMBOL_TRADE_FREEZE_LEVEL Buying is done at the Ask price | Selling is done at the Bid price ------------------------------------------------|---------------------------------- TakeProfit >= Bid | TakeProfit <= Ask StopLoss <= Bid | StopLoss >= Ask TakeProfit - Bid >= SYMBOL_TRADE_STOPS_LEVEL | Ask - TakeProfit >= SYMBOL_TRADE_STOPS_LEVEL Bid - StopLoss >= SYMBOL_TRADE_STOPS_LEVEL | StopLoss - Ask >= SYMBOL_TRADE_STOPS_LEVEL */ if(!RefreshRates() || !m_symbol.Refresh()) { PrevBars=0; return; } //--- FreezeLevel -> for pending order and modification double freeze_level=m_symbol.FreezeLevel()*m_symbol.Point(); if(freeze_level==0.0) freeze_level=(m_symbol.Ask()-m_symbol.Bid())*3.0; freeze_level*=1.1;
Здесь не понятны расчеты:
freeze_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;
freeze_level*=1.1;
Для чего? И зачем умножили *3.0 и *=1.1
Далее код:
Здесь не понятны расчеты:
freeze_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;
freeze_level*=1.1;
Для чего? И зачем умножили *3.0 и *=1.1
Главная задача - отсечь скальперов и любителей пипсовки.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Cidomo:
Работа отложенными Buy stop и Sell stop ордерами.
Автор: Vladimir Karputov