Столкновение экспертов при использовании нескольких пар...

 
Во-первых, я знаю, Raptor, что вы уже поднимали этот вопрос, но я не могу вспомнить, где вы это писали, и, что более важно, понять, где я ошибаюсь?

Насколько я знаю, я писал правильно, чтобы советник, прикрепленный к любой соответствующей паре, мог всегда работать только на этой паре. На данный момент я заметил, что GBPCAD и GBPUSD, похоже, не ладят друг с другом, то есть стоплосс GBPCAD думает, что его расчет производится по паре GBPUSD... поэтому при срабатывании отложенного ордера стоплосс переходит от значений GBPCAD к значениям cable.....

Я использую magicnumber==1234;

Любые предложения или области, в которых я веду себя как идиот, пожалуйста, не стесняйтесь выделить :(

//+-------------------------------------------------------------------------------------+
//| Order Buy Function                                                                  |
//+-------------------------------------------------------------------------------------+   

//Place a pending buystop if no orders exists.. pending or otherwise.
if(direction==0)
{ 
      double btp=buy_takeprofit_price;
      
      double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT);

      double Lot_Step = MarketInfo(Symbol(),MODE_LOTSTEP);

      double BuyLotSize =(RiskedAmount/(pips_to_bsl/pips))/10;
      double Lots = NormalizeDouble(BuyLotSize,2);
      LotSize = MathFloor(Lots/Lot_Step)*Lot_Step;

  
      static double Stored_BuyPrice;

      if(OpenOrdersThisPair(Symbol())==0)
         {
         int BuyTicketOrder= OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green);  >>>>// I am not sure if its this part? There is no way for this first OrderSend to tell what pair it is?
         if(BuyTicketOrder == -1)Print("First Buy Order Last Error = ",GetLastError());
         } 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



      for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue;
           
         if(OrderType()==OP_BUYSTOP) 
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol()) 
                   if(OrderStopLoss()<iMA(NULL,60,MA_Period,0,1,0,0)-ATR)
                        {
                        Stored_BuyPrice = OrderOpenPrice();
                        DeleteOrder = OrderDelete(OrderTicket());
                        }

         if(OpenOrdersThisPair(Symbol())==0 && DeleteOrder==True)// If there are no open orders = place a new order.
            {
            int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,Stored_BuyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green);
            if(NewBuyOrder == -1)Print("New Buy Order Last Error = ",GetLastError());
            }
      }
} 
 
DomGilberto:
Во-первых, я знаю, Raptor, что вы уже поднимали этот вопрос со мной раньше, но я не могу вспомнить, где вы это писали, и, что более важно, понять, где я ошибаюсь?

Насколько я знаю, я писал правильно, чтобы советник, прикрепленный к любой соответствующей паре, мог всегда работать только на этой паре. На данный момент я заметил, что GBPCAD и GBPUSD, похоже, не ладят друг с другом, то есть стоплосс GBPCAD думает, что его расчет производится по паре GBPUSD... поэтому при срабатывании отложенного ордера стоплосс переходит от значений GBPCAD к значениям cable.....

Я использую magicnumber==1234;

Любые предложения или области, в которых я веду себя как идиот, пожалуйста, не стесняйтесь выделить :(

Ваша проблема ясна, но ее трудно понять из-за того, как вы используете отступы в скобках и условия. ... вы делаете это:

      for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue;
           
         if(OrderType()==OP_BUYSTOP) 
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())                                  // if the symbol matches do . . . 
                   if(OrderStopLoss()<iMA(NULL,60,MA_Period,0,1,0,0)-ATR)   //  . . . .  this
                        {
                        Stored_BuyPrice = OrderOpenPrice();                 // and this
                        DeleteOrder = OrderDelete(OrderTicket());           // and this
                        }

         if(OpenOrdersThisPair(Symbol())==0 && DeleteOrder==True)// If there are no open orders = place a new order.   //  this happens even if the symbol didn't match . . .
            {
            int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,Stored_BuyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green);
            if(NewBuyOrder == -1)Print("New Buy Order Last Error = ",GetLastError());
            }
      }

Я думаю, что вы имели в виду следующее...

     for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b, SELECT_BY_POS, MODE_TRADES)) continue;
           
         if( OrderType() == OP_BUYSTOP &&
            OrderMagicNumber() == MagicNumber &&
            OrderSymbol() == Symbol() )        
            {
            if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR)  
               {
               Stored_BuyPrice = OrderOpenPrice();   
               DeleteOrder = OrderDelete(OrderTicket()); 
               }

            if(OpenOrdersThisPair(Symbol()) == 0 && DeleteOrder)  // If there are no open orders = place a new order. 
               {
               int NewBuyOrder = OrderSend(Symbol(), OP_BUYSTOP, LotSize, Stored_BuyPrice, 3, BuyStopPrice, btp, NULL, MagicNumber, 0, Green);
               if(NewBuyOrder == -1) Print("New Buy Order Last Error = ", GetLastError());
               }
            }
         }
 
А, хорошо - такую маленькую мелочь я упустил. Также, когда вызывается первая функция OrderSend(), делаю ли я что-то не так? Я спрашиваю об этом, потому что пытаюсь логически подумать, знает ли она в этот момент, на какую пару нужно отправить ордер? Возможно, это глупый вопрос, но я не делаю ничего плохого в этой части, не так ли? Часть функции отправки "BuyTicketOrder"?

Спасибо, что подсказали мне этот момент :)
 
DomGilberto:
А, хорошо - такую маленькую мелочь я упустил. Также, когда вызывается первая функция OrderSend(), делаю ли я что-то не так? Я спрашиваю об этом, потому что пытаюсь логически подумать, знает ли она в этот момент, на какую пару нужно отправить ордер? Возможно, это глупый вопрос, но я не делаю ничего плохого в этой части, не так ли? Часть функции отправки "BuyTicketOrder"?

Спасибо, что подсказали мне этот момент :)
Symbol() - это символ графика, на котором работает советник. ... он не может ошибиться, это может быть только один символ.
 
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//Moving Average Trailing Stop Function
//+----------------------------------------------------------------------------------------------------------------------------------------+   
void MA_Trail()

  {

   double ATR = iATR(NULL,60,14,1);
   double MA = iMA(NULL,60,MA_Period,0,1,0,1);
   
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   
   double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5);
   double SellStopPrice = NormalizeDouble(SellStopPriceMath,5);

//buy order section - This is where the stop will trail based upon a fixed point value stated on the EA. It will trail with price.
   for(int b=OrdersTotal()-1; b>=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               if(OrderType()==OP_BUY)
               {
                 if(OrderStopLoss() > BuyStopPrice)break; 
                  if(OrderStopLoss() < BuyStopPrice)
                    bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                    if(BuyModify < 0)Print(" Buy Trailing Stop Failed: ", GetLastError());
               }     

     }
//sell order section - This is where the stop will trail based upon a fixed point value stated on the EA. It will trail with price.     
   for(int s=OrdersTotal()-1; s>=0; s--)
     {
      if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               if(OrderType()==OP_SELL)
               {
                 if(OrderStopLoss() < SellStopPrice)break; 
                   if(OrderStopLoss() > SellStopPrice)
                    bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                    if(SellModify < 0)Print(" Sell Trailing Stop Failed: ", GetLastError());
               }   
     }

  }
Хорошо - я думаю, что именно это и было причиной проблемы. Я только что обновил код в этой части и, кажется, теперь он перестал щелкать на каждом тике от цены кабеля до цены GBPCAD... Теперь он застрял на одной стоп-цене, пока не обновится на этом часовом закрытии... так что я подтвержу.

Вам это кажется нормальным? Также, поскольку у меня есть эти частичные закрытия ордеров, я предполагаю, что мне, вероятно, нужно дважды проверить, что скобки находятся в правильном положении относительно "OrderSymbol()==Symbol())"?
 
if(OpenOrdersThisPair(Symbol()) == 0
Сколько раз вы хотите вызвать это? Для каждого ордера (ваш код)? Для каждого отложенного ордера на текущем графике (код RaptorUK)? Или ОДИН раз, после того как вы сохраните и удалите отложенный ордер?
 
DomGilberto:
Хорошо - я думаю, это то, что вызывало проблему. Я только что обновил код в этой части и, кажется, теперь он перестал щелкать на каждом тике от цены кабеля до цены GBPCAD... Теперь он застрял на одной стоп-цене, пока не обновится на этом часовом закрытии... так что я подтвержу.

Вам это кажется нормальным? Также, поскольку у меня есть эти частичные закрытия ордеров, я предполагаю, что мне, вероятно, нужно дважды проверить, что скобки находятся в правильном положении относительно "OrderSymbol()==Symbol())"?

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

Вам не нужно два цикла, достаточно одного...

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//Moving Average Trailing Stop Function
//+----------------------------------------------------------------------------------------------------------------------------------------+   
void MA_Trail()

  {

   double ATR = iATR(NULL,60,14,1);
   double MA = iMA(NULL,60,MA_Period,0,1,0,1);
   
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   
   double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5);
   double SellStopPrice = NormalizeDouble(SellStopPriceMath,5);

   for(int b=OrdersTotal()-1; b>=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               //buy order section - This is where the stop will trail based 
               // upon a fixed point value stated on the EA. It will trail with price.
               if(OrderType()==OP_BUY)
                  {
                  if(OrderStopLoss() > BuyStopPrice) break; 
                  if(OrderStopLoss() < BuyStopPrice)
                     bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                   if(!BuyModify)Print(" Buy Trailing Stop Failed: ", GetLastError());
                   }     

               // sell order section - This is where the stop will trail based 
               // upon a fixed point value stated on the EA. It will trail with price.     
               if(OrderType()==OP_SELL)
                  {
                  if(OrderStopLoss() < SellStopPrice) break; 
                  if(OrderStopLoss() > SellStopPrice)
                     bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                  if(!SellModify)Print(" Sell Trailing Stop Failed: ", GetLastError());
                  }
               }   
     }

OrderModify() возвращает bool, true или false, а не int... поэтому SellModify никогда не будет меньше 0.... Вчера я напечатал то же самое на ForexFactory .

 

Каждый раз, когда ордер был удален - а я хочу, чтобы отложенный ордер удалялся КАЖДЫЙ раз после закрытия часового бара, а затем открывался новый ордер с теми же параметрами, ИЛИ, если применимо, с новыми стопами, целями и размером лота на основе "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0,0)".) - ATR) "

Единственное, что мне нужно сохранить для НОВОГО отложенного ордера (после удаления), это начальная цена входа на этом конкретном сетапе.(Stored_BuyPrice = OrderOpenPrice();)


Это забавно, потому что первый бит кода выше также связан с другой темой, которую я собирался опубликовать. Вместо того, чтобы создавать новую тему с аналогичным вопросом, я задам его здесь, если вы не против? Посмотрите ссылку ниже - это всего лишь двухминутное видео, объясняющее проблему, которая у меня возникла и которую мне трудно решить...

Я написал так много кода, но теперь начинаю понимать, что дело в неэффективности, которую мне приходится устранять...

Видео: http://screencast.com/t/4nl8AaH8Sag

Если я сделал это действительно двусмысленно, предоставив лишь ограниченный объем кода, то я добавлю еще немного?

 
Спасибо Raptor - да, я только что заметил это. Я потратил некоторое время на очистку своего кода, так как он был беспорядочным. Любительские ошибки, такие как попытка использовать Prints, как в примере, который вы привели выше lol.
 
DomGilberto:

Каждый раз, когда ордер был удален - а я хочу, чтобы отложенный ордер удалялся КАЖДЫЙ раз после закрытия часового бара, а затем открывался новый ордер с теми же параметрами, ИЛИ, если применимо, с новыми стопами, целями и размером лота на основе "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0,0)".) - ATR) "

Единственное, что мне нужно сохранить для НОВОГО отложенного ордера (после удаления), это начальная цена входа на этом конкретном сетапе.(Stored_BuyPrice = OrderOpenPrice();)


Это забавно, потому что первый бит кода выше также связан с другой темой, которую я собирался опубликовать. Вместо того, чтобы создавать новую тему с аналогичным вопросом, я задам его здесь, если вы не против? Посмотрите ссылку ниже - это всего лишь двухминутное видео, объясняющее проблему, которая у меня возникла и которую мне трудно решить...

Я написал так много кода, но теперь начинаю понимать, что дело в неэффективности, которую мне приходится устранять...

Видео: http://screencast.com/t/4nl8AaH8Sag

Если я сделал это действительно двусмысленно, предоставив лишь ограниченное количество кода, то я добавлю еще немного?

Поправьте меня, если я неправильно понимаю... но на большинстве баров в видео вы не получили откат к 21 EMA.
 
Извините - Это моя вина, что я не объяснил это должным образом. Я смотрю на D1, 4Hr и, наконец, 1Hr, чтобы MA's были разнесены (среди кучи других фильтров) - Как только они все выстроились, на H1 он будет ждать, пока любой бар не отступит к 21 EMA ОДИН раз, а затем оттуда он разместит ордер выше максимумов и стоп ниже 60 EMA - ATR.

Откат к 21 ЕМА происходит только один раз. После этого он перестанет искать любые откаты к 21 ЕМА. Однако, что он должен делать, так это следить за тем, чтобы текущий открытый ордер PENDING точно соответствовал лотам, стопам и тейк-профитам ПОСЛЕ каждого часового закрытия. Однако я не могу понять, почему иногда он работает безупречно и обновляет отложенный ордер после каждого закрытия H1, а иногда нет? Причина, по которой отложенный ордер обновляется, заключается в том, что ""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0, 0.) - ATR) ".

Если это не так, то он не обновится - КАК бы то ни было, есть бесчисленное количество случаев, когда это так, но он не удалит ордер и не поставит новый с новыми значениями?

Не уверен, что вы можете увидеть что-то в этом коде выше относительно видео? (Первый код, который вы исправили). Надеюсь, так понятнее?
Причина обращения: