Открыть противоположный ордер - страница 3

 
RaptorUK:

Это может быть, если он имеет другой Magic Number, чемMagicNumber, или это для символа, отличного от символа, на котором работает советник, или если это OP_SELLLIMIT или OP_BUYLIMIT . . Также необходимо проверить возвращаемые значения из вызовов OrderDelete(). ...

Зачем вам нужно вызывать RefreshRates()? Я не имею в виду избавиться от них, но вы можете объяснить, почему вы вызываете RefreshRates() там, где вы находитесь?


Что такое возвращаемые значения функций? Как их использовать?


Привет, RaptorUK.

Насколько я понимаю, MagicNumber одинаковый и OP_SELLSTOP и OP_BUYSTOP.

Вызовы OrderDelete(), боюсь, не понимаю, что вы имеете в виду.

RefreshRates() я просто поместил туда после проблемы с закрытием.

Сейчас я нахожусь в Лиссабоне (Португалия).

Луис

 
luisneves:


Привет RaptorUK.

Насколько я понимаю, MagicNumber одинаковый и для OP_SELLSTOP и OP_BUYSTOP.

Вызовы OrderDelete(), боюсь, я не понимаю, что вы имеете в виду.

Когда вы вызываете OrderDelete() (с помощью функции OrderDelete()), она возвращает значение, она возвращает значение bool, если значение true, то OrderDelete() сработала, если false, то OrderDelete() не сработала . . поэтому проверьте возвращаемое значение и, если оно ложно, сообщите об ошибке в журнал с помощью Print() или используйте Comment() или Alert(), чтобы вы знали, что у вас есть проблема и могли ее расследовать.

На основе вашего кода я бы сделал эти изменения... ...если бы это был мой код, я бы сделал дополнительные изменения, чтобы выводить больше информации в случае ошибки, Bid, Ask, FreezeLevel, StopLevel и т.д.

void CloseAll()
   {
   int OrdType, GLError;
   
   RefreshRates();
                    
   for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)
      if( OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
         && OrderMagicNumber() == MagicNumber 
         && OrderSymbol() == Symbol())
         {
         OrdType = OrderType();
         if(OrdType == OP_BUY || OrdType==OP_SELL)
            {
            if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), UseSlippage, Yellow))
               GLError = GetLastError();
            }

         if(OrdType == OP_SELLSTOP || OrdType == OP_BUYSTOP || OrdType == OP_BUYLIMIT || OrdType == OP_SELLLIMIT)
            {
            if(!OrderDelete(OrderTicket())
               GLError = GetLastError();
            }

         if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());         
         }
   } 
 
RaptorUK:

Когда вы вызываете OrderDelete() (с помощью функции OrderDelete()), она возвращает значение, она возвращает значение bool, если значение true, то OrderDelete() сработала, если false, то OrderDelete() не удалась . . поэтому проверьте возвращаемое значение и, если оно ложно, сообщите об ошибке в журнал с помощью Print() или используйте Comment() или Alert(), чтобы вы знали, что у вас есть проблема и могли ее решить.

На основе вашего кода я бы сделал эти изменения... ...если бы это был мой код, я бы сделал дополнительные изменения, чтобы вывести больше информации в случае ошибки, Bid, Ask, FreezeLevel, StopLevel и т.д.


Привет, RaptorUK,

Причина, по которой отложенный ордер не был удален, связана с тейк-профитом, который был слишком низким, в данном случае 5 пунктов. Когда я увеличил его до 10 пунктов, ордер удалился. Моя путаница происходит от того, что если у меня была процедура, чтобы поместить стоплосс, цену открытия и тейкпрофит из зоны заморозки, почему это не сработало. Хорошо, но теперь все работает.

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

Есть помощь?

 while(IsTradeContextBusy()) Sleep(10);
                   RefreshRates();
         Ticket=OrderSend(Symbol(),OP_BUYSTOP,LotSize,BuyLevel,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Stop Order",MagicNumber,0,Green);
         if(Ticket>0)
         
          int o=OrderType();
          if (o==OP_BUY)
          OrderDelete(OrderTicket());        
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY Stop Order Opened : ",OrderOpenPrice());
           }
         //else Print("Error opening BUY Stop Order : ",GetLastError());
 
luisneves:


Привет, RaptorUK,

1. причина, по которой отложенный ордер не был удален, связана с тейк-профитом, который был слишком низким, в данном случае 5 пунктов. Когда я увеличил его до 10 пунктов, ордер удалился. Мое замешательство вызвано тем, что если у меня была процедура установки стоплосса, цены открытия и тейкпрофита вне зоны заморозки, почему это не сработало. Хорошо, но теперь все работает.

2. Кстати, я хочу закрыть противоположный ордер, как только сработает другой. Для этого я ввел этот дополнительный код, но (можете начинать смеяться...), но ничего не получилось.

Есть ли здесь помощь?


1. Вот почему вам нужно проверять возвращаемые значения, выводить коды ошибок и т.д. Вы должны убедиться, что любые торговые действия по любому ордеру соответствуют информации здесь:Требования и ограничения при совершении сделок

2. Ю. должен подождать, пока ордер изменит тип с OP_BUYSTOP на OP_BUY, это может занять некоторое время, поэтому вам нужно постоянно проверять... Как только он превратится в OP_BUY, вы можете закрыть противоположный ордер, и для этого вам придется найти правильный ордер для закрытия. вам следует прочитать мой недавний разговор сWhooDoo22, который охватывает аналогичную тему.

 

Здравствуйте, RaptorUk,

Я перешел по ссылке, которую вы дали, но тема хоть и интересная, но слишком длинная и с таким количеством расходящихся мнений, что я запутался в них.

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

спасибо за любой свет.....

Луис

//Sell Pending Stop Loss & Take Profit Calculation     
     
   if(StopLoss>0)SellStopLoss=PendingSellPrice+(StopLoss*pt);
   if(TakeProfit>0)SellTakeProfit=PendingSellPrice-(TakeProfit*pt);
   
//Place Sell Pending Order
        
         while(IsTradeContextBusy()) Sleep(10);
                   RefreshRates();       
         Ticket=OrderSend(Symbol(),OP_SELLSTOP,LotSize,SellLevel,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Stop Order",MagicNumber,0,Red);
         if(Ticket>0)OppositePendindDel();          
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL Stop Order Opened : ",OrderOpenPrice());
           }
        //else Print("Error opening SELL Stop Order : ",GetLastError());
         } 
//+---------------------------------------------------------------------------+
int OppositePendindDel()
{
 int c,d,GLError;
 int e=OrdersTotal();
 
 for(c=e-1;c>=0;c--)
 {  
   OrderSelect(c,SELECT_BY_POS,MODE_TRADES);
   if(OrderType()==OP_BUY||OrderType()==OP_SELL)
   {
    for(d=e-1;d>=0;d--)
    {
     OrderSelect(d,SELECT_BY_POS,MODE_TRADES);
     
      if(OrderType()==OP_SELLSTOP)
     {
      if(!OrderDelete(OrderTicket()))
            GLError = GetLastError();
      
      return(1);
      }
      if(OrderType()==OP_BUYSTOP)
      {
       if(!OrderDelete(OrderTicket()))
             GLError = GetLastError();
       }
       if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());
       return(1);
       }
      }
     }
    }
 
luisneves:

Здравствуйте, RaptorUk,

Я перешел по ссылке, которую вы дали, но тема хоть и интересная, но слишком длинная и с таким количеством расходящихся мнений, что я запутался в них.

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

RaptorUK:

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

 
RaptorUK:



Привет RaptorUK ,

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

Любая помощь здесь, пожалуйста!!!!

Файлы:
 
luisneves:


Привет RaptorUK ,

Хорошо, теперь кажется, что удаляется противоположный отложенный ордер после того, как сработал один отложенный.,но теперь некоторые ордера приходят двойными, то есть ea ставит sell и buy одновременно и размер лота одинаков для двух ордеров, когда она должна ставить по одному ордеру за раз. Я начал сходить с ума.....

Любая помощь здесь, пожалуйста!!!!

Глядя на ваш код, мне очень трудно понять, что вы пытаетесь сделать, я вижу очень мало комментариев, чтобы помочь мне, ваша функция start() не показывает мне, что вы пытаетесь сделать на каждом тике, у вас нет последовательного расположения отступов.

Что должна делать функция GoToClose()? Если бы вы сделали несколько комментариев в начале функции, описывающих, что она должна делать, тогда я мог бы увидеть, действительно ли она делает то, что должна делать, в настоящее время то, что она делает, это вызываетфункцию CloseAll(); если любая отдельная сделка, соответствующая вашему символу и магическому номеру, находится в прибыли на любую сумму, или если у вас есть более 7 сделок для любого символа и любого магического номера. CloseAll() закрывает сделки только длявашего символа и магического номера, поэтому если у вас есть 7 сделок для другого символа или магического номера, GoToClose() будет продолжать вызывать CloseAll(), и больше ничего не произойдет.


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

Вам нужно получить четкое представление о том, что вы пытаетесь сделать, прокомментировать функцию start(), чтобы поток и процесс был ясен, прокомментировать каждую функцию, чтобы было ясно, что каждая из них должна делать. Когда вы это сделаете, вы сможете понять, где кроется ваша проблема....

 
RaptorUK:

Глядя на ваш код, мне очень трудно понять, что вы пытаетесь сделать, я вижу очень мало комментариев, чтобы помочь мне, ваша функция start() не показывает мне, что вы пытаетесь сделать на каждом тике, у вас нет последовательного расположения отступов.

Что должна делать функция GoToClose()? Если бы вы сделали несколько комментариев в начале функции, описывающих, что она должна делать, тогда я мог бы увидеть, действительно ли она делает то, что должна делать, в настоящее время то, что она делает, это вызывает функциюфункцию CloseAll(); если любая отдельная сделка, соответствующая вашему символу и магическому номеру, находится в прибыли на любую сумму, или если у вас есть более 7 сделок для любого символа и любого магического номера. CloseAll() закрывает сделки только длявашего символа и магического номера, поэтому если у вас есть 7 сделок для другого символа или магического номера, GoToClose() будет продолжать вызывать CloseAll(), и больше ничего не произойдет.


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

Вам нужно получить четкое представление о том, что вы пытаетесь сделать, прокомментировать функцию start(), чтобы поток и процесс был ясен, прокомментировать каждую функцию, чтобы было ясно, что каждая из них должна делать. Когда вы это сделаете, вы, возможно, поймете, где кроется ваша проблема....


Привет RaptorUK,

Извините за беспорядок. На данный момент кажется, что советник делает то, что от него ожидают, за исключением этой проблемы;

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

Теперь я разложил код по функциям. Причина, по которой у меня есть все эти недействительные вызовы, заключается в том, что я хочу иметь полностью рабочие независимые блоки, и здесь я знаю, что у меня проблемы с организацией этого Go to Open и Go to Close - это просто способ сказать, что если у нас нет открытых ордеров, то первые переходят к открытию, если нет, то к закрытию (это беспорядок, мне нужно поработать над этим....) Я использую символ и магическое число, чтобы гарантировать, что ea имеет дело только с собственными ордерами.

Основная стратегия такова (и блоки в этом порядке);

1- Два отложенных ордера - над и под ценой. Как только цена срабатывает по одному из них, противоположный отложенный ордер удаляется. Это работает.

2- Если цена достигает TakeProfit, то ордер закрывается и советник снова выставляет два отложенных ордера и процесс начинается заново. Это работает

2- Если цена не выбирает TakeProfit и отскакивает назад, как только она достигает суммы TakeProfit (для ордеров на покупку), то противоположный ордер на продажу должен открыться с той же суммой TakeProfit и размером лота больше, чем предыдущий. Это работает, за исключением того, что он выставляет более одного ордера, и из отчета видно, что ордера 6 и 7 являются ордерами на продажу, а должен быть только один, а 7 должен быть на покупку.

3- Как только последний ордер получит прибыль, все открытые ордера должны закрыться. И процесс начинается заново. Это работает.

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

5-Для открытия возможности увеличения прибыли следует использовать безубыточный или минимально прибыльный трейлинг стоп. Например, если мы хотим для TakeProfit 2 пункта, то ждем, пока цена достигнет 3 пунктов, а затем одной из этих функций (безубыточный или минимально прибыльный трейлинг стоп) устанавливаем стоп-линию на уровне 2 пунктов. Если цена пойдет вверх (на покупку), то стоп-линия пойдет вместе с ней, и как только цена отскочит на 1 пункт, ордер закроется, а поскольку он имеет прибыль, все открытые ордера будут закрыты. Здесь я не уверен, что это может работать правильно.

Спасибо

Луис

Файлы:
 
luisneves:


Привет, RaptorUK,

Извините за беспорядок. На данный момент кажется, что советник делает то, что от него ожидают, за исключением этой проблемы;

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

Теперь я разложил код по функциям. Причина, по которой у меня есть все эти недействительные вызовы, заключается в том, что я хочу иметь полностью рабочие независимые блоки, и здесь я знаю, что у меня проблемы с организацией этого Go to Open и Go to Close - это просто способ сказать, что если у нас нет открытых ордеров, то первые переходят к открытию, если нет, то к закрытию (это беспорядок, мне нужно поработать над этим....) Я использую символ и магическое число, чтобы гарантировать, что ea имеет дело только с собственными ордерами.

Основная стратегия заключается в следующем (и блоки находятся в этом порядке);

1- Два отложенных ордера - над и под ценой. Как только цена срабатывает по одному из них, противоположный отложенный ордер удаляется. Это работает.

2- Если цена достигает TakeProfit, то ордер закрывается и советник снова выставляет два отложенных ордера и процесс начинается заново. Это работает

2- Если цена не выбирает TakeProfit и отскакивает назад, как только она достигает суммы TakeProfit (для ордеров на покупку), то противоположный ордер на продажу должен открыться с той же суммой TakeProfit и размером лота больше, чем предыдущий. Это работает, за исключением того, что он выставляет более одного ордера, и из отчета видно, что ордера 6 и 7 являются ордерами на продажу, а должен быть только один, а 7 должен быть на покупку.

3- Как только последний ордер получит прибыль, все открытые ордера должны закрыться. И процесс начинается заново. Это работает.

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

5-Для открытия возможности увеличения прибыли следует использовать безубыточный или минимально прибыльный трейлинг стоп. Например, если мы хотим для TakeProfit 2 пункта, то ждем, пока цена достигнет 3 пунктов, а затем одной из этих функций (безубыточный или минимально прибыльный трейлинг стоп) устанавливаем стоп-линию на уровне 2 пунктов. Если цена пойдет вверх (на покупку), то стоп-линия пойдет вместе с ней, и как только цена отскочит на 1 пункт, ордер закроется, а поскольку он имеет прибыль, все открытые ордера будут закрыты. Здесь я не уверен, что это может работать правильно.

Спасибо

Луис

Хорошо, думаю, что нашел, что не так с открытием нескольких ордеров. Мне пришлосьвключить их в код (курсив Негрито);

Open Opposite Order
 
   double  MartingaleBuyPrice = Ask+StopLevel;
   if(MartingaleBuyPrice<UpperStopLevel)MartingaleBuyPrice=UpperStopLevel+MinStop*pt;
   
   double MartingaleSellPrice= Bid-StopLevel;
   if(MartingaleSellPrice>LowerStopLevel)MartingaleSellPrice=LowerStopLevel-MinStop*pt;
   
   int Op;  
   
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY && ((OrderOpenPrice()-OrderClosePrice())/pt)> ReturnDist && SellTicket==0)
               {                
               Sell Ticket = OrderSend(Symbol(), OP_SELL, mlots, MartingaleSellPrice, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Sell Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", SellTicket);
                  AddLimitsSell();
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError() );
                  }
               }
               
            if(Op == OP_SELL && (OrderClosePrice()-OrderOpenPrice()/pt)> ReturnDist && BuyTicket==0)
               {               
               Buy Ticket = OrderSend(Symbol(), OP_BUY, mlots, MartingaleBuyPrice, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Buy Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", BuyTicket);
                  AddLimitsBuy();
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError());
                  }   
               }
            }
         }
      }
   }
//+------------------------------------------------------------------+  
void AddLimitsBuy()
                  {
                  OrderSelect(Buy Ticket,SELECT_BY_TICKET);
                  OpenPrice = OrderOpenPrice();
                  StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
                                       RefreshRates();  
                                      UpperStopLevel = Ask + StopLevel;
                                      LowerStopLevel = Bid - StopLevel;
                                      
                                      
                                      if(StopLoss > 0) BuyStopLoss   = OpenPrice - (StopLoss * pt);
                  if(TakeProfit > 0)BuyTakeProfit = OpenPrice + (TakeProfit * pt);
                                      
                                      if(BuyStopLoss > 0 && BuyStopLoss > LowerStopLevel) 
                                              {                                 
                                                    BuyStopLoss = LowerStopLevel - MinStop*pt;
                                              }
                                      
                                      if(BuyTakeProfit > 0 && BuyTakeProfit < UpperStopLevel) 
                                              {
                                                     BuyTakeProfit = UpperStopLevel + MinStop*pt;
                                              }

                                      if(IsTradeContextBusy())Sleep(10);        

                  if(BuyStopLoss > 0 || BuyTakeProfit > 0) 
                     {          
                      OrderModify(Ticket,OP_BUY,BuyStopLoss,BuyTakeProfit,0);                            
                     }
                    } 
//+------------------------------------------------------------------+
void AddLimitsSell()
                  {
                  OrderSelect(Sell Ticket,SELECT_BY_TICKET);                 
                  OpenPrice = OrderOpenPrice();
                  StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
                                      RefreshRates();   
                                      UpperStopLevel = Ask + StopLevel;
                                      LowerStopLevel = Bid - StopLevel;
                                      
                                      
                                      if(StopLoss > 0) SellStopLoss = OpenPrice + (StopLoss*pt);
                                      if(TakeProfit > 0) SellTakeProfit = OpenPrice - (TakeProfit*pt);
                                    
                                      if(SellStopLoss > 0 && SellStopLoss < UpperStopLevel) 
                                              {                                 
                                                    SellStopLoss = UpperStopLevel + MinStop*pt;
                                              }
                                      if(SellTakeProfit> 0 && SellTakeProfit > LowerStopLevel) 
                                              {
                                                    SellTakeProfit = LowerStopLevel - MinStop*pt;
                                              }
                                            
                                      if(IsTradeContextBusy()) Sleep(10);       

                  if(SellStopLoss > 0 || SellTakeProfit > 0) 
                    {           
                      OrderModify(Ticket,OP_SELL,SellStopLoss,SellTakeProfit,0);
                    }                    
                   }  


Отсутствующий файл отчета
Причина обращения: