Проблема с общим количеством открытых ордеров - страница 3

 
Вы должны показать весь измененный код.
 
Выведите свои переменные до и внутри операторов if и узнайте, почему.
 
WHRoeder:
Выведите свои переменные до и внутри операторов if и выясните причину.

Хорошо, спасибо, я сделаю это и изучу этот вопрос подробнее. Я также нашел этот фрагмент кода, который меня заинтриговал, потому что SL и TP отделены от OrderSend. Я изучу и это.

ticket = OrderSend( Symbol(), OP_SELL, getPositionSize(), Bid, 3, 0, 0, "Basic CCI EA", magic, 0 , Red );
         OrderModify( ticket, OrderOpenPrice(), Bid + SL, Bid - TP, 0 );
 

Привет всем

Я исправил большинство своих проблем и советник отлично работает в тестере, но у меня все еще есть проблемы с OrdersTotal. В демо-режиме он иногда открывает оба отложенных ордера Stop, но чаще всего только buy или sell. Я хочу, чтобы оба отложенных ордера открывались одновременно (в течение нескольких секунд), но только если нет других ордеров или отложенных ордеров. Я думаю, что происходит так: иногда он открывает оба отложенных ордера, прежде чем успевает подсчитать количество ордеров, а иногда он действительно понимает, что отложенный ордер отправлен, и не открывает другой. Я думал, что если я помещу ордера в фигурные скобки, то он выполнит оба, когда условие if будет выполнено. Я также теперь знаю, что он будет продолжать открывать отложенные ордера, когда я их удалю, до тех пор, пока формируется последняя свеча, т.е. пока переменная Time совпадает со свечой Time[0], тики не имеют значения.

Вот этот кусочек кода:

extern datetime StartTime1 = D'2016.03.15 15:05';
int start(){
int buy_ticket=0, sell_ticket=0, buystop_ticket=0, sellstop_ticket=0, total=0;
   for(int i= OrdersTotal()-1; i>= 0; i--)
      if(OrderSelect(i,SELECT_BY_POS) && OrderMagicNumber()==magic && OrderSymbol()==Symbol())
        {
         total++;
         if(OrderType()==OP_BUYSTOP) buystop_ticket=OrderTicket();
         if(OrderType()==OP_SELLSTOP) sellstop_ticket=OrderTicket();
         if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
         if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
        }

   if(total==0 && Time[0]==StartTime1)
     {
      buystop_ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Price,30,Ask-SL,0,"Pending",magic,0,Lime);
      sellstop_ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Price,30,Bid+SL,0,"Pending",magic,0,Red);
     }

Есть ли лучший или более простой способ сделать это? Спасибо.

 
Trader3000:

Привет всем

Я исправил большинство своих проблем и советник отлично работает в тестере, но у меня все еще есть проблемы с OrdersTotal. В демо-режиме он иногда открывает оба отложенных ордера Stop, но чаще всего только buy или sell. Я хочу, чтобы оба отложенных ордера открывались одновременно (в течение нескольких секунд), но только если нет других ордеров или отложенных ордеров. Я думаю, что происходит так: иногда он открывает оба отложенных ордера, прежде чем успевает подсчитать количество ордеров, а иногда он действительно понимает, что отложенный ордер отправлен, и не открывает другой. Я думал, что если я помещу ордера в фигурные скобки, то он выполнит оба, когда условие if будет выполнено. Я также теперь знаю, что он будет продолжать открывать отложенные ордера, когда я их удалю, до тех пор, пока формируется последняя свеча, т.е. пока переменная Time совпадает со свечой Time[0], тики не имеют значения.

Вот этот кусочек кода:

Есть ли лучший или более простой способ сделать это? Спасибо.

Проверяете ли вы значение buystop_ticket и sellstop_ticket? Если открыт только один, то второй никогда не будет открыт (если вы не удалите первый вручную).
 
Trader3000 Я также нашел этот фрагмент кода, который заинтриговал меня тем, что SL и TP отделены от OrderSend. Я рассмотрю и это.
ticket = OrderSend( Symbol(), OP_SELL, getPositionSize(), Bid, 3, 0, 0, "Basic CCI EA", magic, 0 , Red );
         OrderModify( ticket, OrderOpenPrice(), Bid + SL, Bid - TP, 0 );
Когда ECN-брокеры только начинали работать, OrderSend не срабатывал при установленных SL/TP. Большинство из них исправили это, начиная с версии 600.
 
zirkoner:
Проверяете ли вы значение buystop_ticket и sellstop_ticket? Если открыт только один, второй никогда не будет открыт (если вы не удалите первый вручную).

Спасибо за ответ. На самом деле оба ордера buystop и sellstop открываются примерно в 50% случаев. В остальных 50% случаев отправляется либо buy, либо sell. Но я кое-что выяснил. Я спросил о последней ошибке, и в тех случаях, когда оба ордера отправляются, ошибок нет, но когда открывается только один, я получаю ошибку 130 на тот ордер, который не открылся. Таким образом, похоже, что мои стопы недействительны, но я не знаю почему. Вот код для SL:

extern int StopLossOriginal=11;

int start(){
int stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
   if(StopLossOriginal<=stoplevel) StopLossOriginal=stoplevel;

double point=Point*10,
       Price=Pipmove*point,
       SL=(StopLossOriginal-Pipmove)*point;

 if(total==0 && (Time[0]==time1)
     {
      buystop_ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Price,30,Ask-SL,0,"Pending",magic,0,Lime);
      Print("Buystop ticket =",buystop_ticket);
      sellstop_ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Price,30,Bid+SL,0,"Pending",magic,0,Red);
      Print("Sellstop ticket =",sellstop_ticket);
     }

Также я добавил функцию Print. Это то, что вы имели в виду, говоря "Вы проверяете значение buystop_ticket и sellstop_ticket? "? Она возвращает два значения, а именно:

2016.03.24 17:11:22.532 News_v10 GBPUSD,M1: Buystop ticket =-1

2016.03.24 17:11:23.227 News_v10 GBPUSD,M1: Buystop ticket =49644335



 
WHRoeder:
Когда ECN брокеры начали свою работу, OrderSend не работал при установленных SL/TP. Большинство из них исправили это с билда 600.
Спасибо за ваш ответ. Я также пробовал это, но это ничего не изменило. Я на билде 950.
 
Trader3000:

Спасибо за ответ. На самом деле оба ордера buystop и sellstop открываются примерно в 50% случаев. В остальных 50% случаев отправляется либо buy, либо sell. Но я кое-что выяснил. Я спросил о последней ошибке, и в тех случаях, когда оба ордера отправляются, ошибок нет, но когда открывается только один, я получаю ошибку 130 на тот ордер, который не открылся. Таким образом, похоже, что мои стопы недействительны, но я не знаю почему. Вот код для SL:

Также я добавил функцию Print. Это то, что вы имели в виду, говоря "Вы проверяете значение buystop_ticket и sellstop_ticket? "? Она возвращает два значения, а именно:

2016.03.24 17:11:22.532 News_v10 GBPUSD,M1: Buystop ticket =-1

2016.03.24 17:11:23.227 News_v10 GBPUSD,M1: Buystop ticket =49644335



Вам нужно добавить RefreshRates() между вашими 2 OrderSend().
 
zirkoner:
Вам нужно добавить RefreshRates() между двумя OrderSend().
Сработало. Большое спасибо.
Причина обращения: