Проблема множественных заказов

 

Привет всем,

У меня проблема с моим кодом. Когда ордер (покупка или продажа) открывается, другие ордера приходят подряд.

Я пытаюсь сделать следующее;

если последний ордер на продажу, то открыть ордер на покупку, когда цена будет выше цены открытия ордера плюс несколько пунктов(ReturnDist).

если последний ордер на покупку, то открываю ордер на продажу, когда цена опускается ниже Openprice минус несколько пунктов.

Может ли кто-нибудь помочь в этом вопросе?

Заранее спасибо

Луис

Файлы:
 
luisneves:

Привет всем,

У меня проблема с моим кодом. Когда ордер (покупка или продажа) открывается, другие ордера приходят подряд.

Я пытаюсь сделать следующее;

если последний ордер на продажу, то открыть ордер на покупку, когда цена будет выше цены открытия ордера плюс несколько пунктов(ReturnDist).

если последний ордер на покупку, то открываю ордер на продажу, когда цена опускается ниже Openprice минус несколько пунктов.

Кто-нибудь может помочь?

Заранее спасибо

Луис

Что вы планируете ограничить?

Вы инициализируете OpenOpposite значением 1.

int    Ticket,total,OpenOpposite=1,UseSlippage,i;

На каждом тике вы вызываете OpenOppositeOrder().

   int start()
     {
      if (OrdersTotal()==0)GoToOpen();
       else GoToClose();      
      if(OpenOpposite>0)OpenOppositeOrder(); //<-- here 
      if(OrdersTotal()>0)OpPendingDel();
      
     }

Я не вижу никаких других ссылок на OpenOpposite.

Цикл for в OpenOppositeOrder не имеет никаких ограничений из того, что я видел до сих пор... а должен ли?

Как вы думаете, где в вашем коде ошибка?

 

Здравствуйте, Кронин,

Прежде всего спасибо за ваш быстрый ответ.

Извините за беспорядок, но я пытался сделать независимые работающие блоки кода.

Итак, я убрал строку, которую вы отметили, и верхнюю часть, где написано void OpenOpposite (), и теперь появляются некоторые ошибки, такие как;

выражение в глобальной области видимости недопустимо и т.д.

Если я не отнимаю у вас много времени, не могли бы вы мне помочь?

Спасибо

Луис



 
luisneves:

Здравствуйте, Кронин,

Прежде всего спасибо за ваш быстрый ответ.

Извините за беспорядок, но я пытался сделать независимые работающие блоки кода.

Итак, я убрал строку, которую вы отметили, и верхнюю часть, где написано void OpenOpposite (), и теперь появляются некоторые ошибки, такие как;

выражение в глобальной области видимости недопустимо и т.д.

Если я не отнимаю у вас много времени, не могли бы вы мне помочь?

Спасибо

Луис

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

Попробуйте следующее (я не тестировал):

Измените функцию start на (Возможно, вам придется фильтровать только открытые рыночные ордера -> в зависимости от вашей стратегии):

   int start()
     {
      if(OrdersTotal()==0){GoToOpen();OpenOpposite=0;} //<-- set OpenOpposite to 0 if no order is open (pending and market)
      else GoToClose();      
      if(OpenOpposite==0)OpenOppositeOrder();          //<-- only run OpenOpositeOrder, if OpenOpposite is 0.
      if(OrdersTotal()>0)OpPendingDel();      
     }

Добавьте счетчик OpenOpposite в функцию OpenOppositeOrder():

         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY  && Ask < (OrderOpenPrice()- ReturnDist*pt))
               {                
               Ticket = OrderSend(Symbol(), OP_SELL, mlots, SellPrice, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  OpenOpposite++;
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError());
                  }
               }
               
            if(Op == OP_SELL && Bid > (OrderOpenPrice()+ ReturnDist*pt))
               {               
               Ticket = OrderSend(Symbol(), OP_BUY, mlots, BuyPrice, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  OpenOpposite++;
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError());
                  }   
               }
            }

Это должно решить проблему с открытием нескольких ордеров подряд. Это ограничивает советника в открытии более одного (противоположного) ордера.

 
luisneves:

Привет всем,

У меня проблема с моим кодом. Когда ордер (покупка или продажа) открывается, другие приходят подряд.

Зачем нужна вторая тема про один и тот же кусок кода?

RaptorUK:

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


Из этой темы:https: //www.mql5.com/en/forum/142629 страница 3

 
RaptorUK:

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

Согласен с этим. Я не проверял ничего другого, кроме проблемы с несколькими ордерами, потому что код нелегко читать. Похоже, что часть кода скопирована и вставлена из другого кода, написанного кем-то другим. Лучше писать свои собственные функции с собственным (последовательным) стилем.

 
kronin:

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

Попробуйте следующее (я не тестировал):

Измените функцию start на (Возможно, вам придется фильтровать только открытые рыночные ордера -> в зависимости от вашей стратегии):

Добавьте счетчик OpenOpposite в функцию OpenOppositeOrder():

Это должно решить проблему с открытием нескольких ордеров подряд. Это ограничивает советника в открытии более одного (противоположного) ордера.


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

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

Первое открытие по индикатору - это покупка (может быть и продажа, конечно), затем открывается ордер на покупку, если цена отскакивает вниз до уровня ниже цены открытия ордера на покупку, то открывается ордер на продажу, но если цена снова пойдет вверх, то нового открытия на покупку не должно произойти. Новый ордер на покупку должен быть открыт только тогда, когда цена отскочит от ордера на продажу. Все то же самое, если ордер на продажу будет первым.
Я пытался добиться этого с помощью следующего кода, но он не работает. Здесь работает то, чтопервым открывается ордер на покупку, затем, как и ожидалось, открывается ордер на продажу, но после этого никакие другие ордера не откры ваются...

У меня есть эти два блока кода, и кажется, что первый делает то, что ожидается; Открывает ордер на покупку или продажу, если есть условия, определенные индикатором. Как только получен билет ордера
, происходит модификация ордера для отправки лимитов ордеров.

Я использую BuyTicket и SellTicket в коде, чтобы избежать открытия нескольких ордеров, но, похоже, это не правильный метод...

// Buy Order Condition to Open

  if(Volume[0] > volume_previous + OpenDistance*pt && BuyTicket == 0)                       
          {//5  
          while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                       
     BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket > -1)
        {//6
         Print("Opposite Buy order placed # ",BuyTicket);
         AddLimitsBuy();        
         }//6
      else
         {//7 
         Print("Order Send failed, error # ", GetLastError());
         }//7 
         
      return(0);
      }//5
  //-----------------------------------------------------------------------------+      
  
  // Sell Order Condition to Open

  if(Volume[0] < volume_previous - OpenDistance*pt && SellTicket == 0)                   
     {//8                                 
          while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                                                
          SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,RealSlippage,0,0,"Sell Order",MagicNumber,0,Red);
          if(SellTicket > -1)
                  {//9
        Print("Opposite Sell order placed # ", SellTicket);
        AddLimitsSell();       
        }//9
     else
        {//10
        Print("Order Send failed, error # ", GetLastError());
        }//10      
     return(0);
     }//8                       


Следующий код определяет открытые ордера и фильтрует их по символу покупки, магическому номеру и типу ордера. Как только он обнаруживает последний открытый ордер в пуле и если условие для открытия (учитывая, что последний ордер является покупкой) и подтверждает, что билет на продажу не присутствует, то открывается ордер на продажу. То же самое, если последний ордер на продажу. И здесь код работает.

Проблема возникает, когда приходит условие для открытия третьего ордера и так далее. Здесь, тем не менее, условия для открытия есть, и код прекрасно справился со вторым открытием, почему код не работает здесь?

int Op;  
   
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {//14
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {//15
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {//16
            Op = OrderType();

            if(Op == OP_BUY && Bid < OrderOpenPrice() - (ReturnDist*pt) && SellTicket == 0)
               {//17               
               SellTicket = OrderSend(Symbol(), OP_SELL, MLots, Bid, RealSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(SellTicket > -1) 
                  {//18
                  Print("Opposite Sell order placed # ", SellTicket);
                  AddLimitsSell();
                  }//18
               else
                  {//19
                  Print("Order Send failed, error # ", GetLastError() );
                  }//19
                }//17
                           
            if(Op == OP_SELL && Ask > OrderOpenPrice() + (ReturnDist*pt)&& BuyTicket == 0)
               {//20             
               BuyTicket = OrderSend(Symbol(), OP_BUY, MLots, Ask, RealSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(BuyTicket > -1)
                  {//21
                  Print("Opposite Buy order placed # ", BuyTicket);
                  AddLimitsBuy();
                  }//21
               else
                  {//22  
                  Print("Order Send failed, error # ", GetLastError());
                  }//22   
               }//20
            }//16
         }//15    
      }//14

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

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

Я буду очень признателен, если вы сможете мне помочь.


наилучшие пожелания
Луис

Файлы:
 
Вы знаете, что дает Volume[0]? Какой смысл добавлять к нему значение Point?
 

Привет, Раптор,

Вы правы!

Я все еще учусь и пробую несколько способов, чтобы получить то, что мне нужно, и иногда получаются глупые вещи.

Я пытался использовать объект, чтобы поместить его на уровень Bid и затем получить эту позицию для открытия ордеров, кажется, лучше, чем этот вариант. Один из главных вопросов - как ограничить открытие новых ордеров, пока открытый ордер не закрыт.

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

В любом случае, спасибо, что показали мне, что объем - это не способ получить такой индикатор.

С наилучшими пожеланиями

Луис

 
luisneves:

Привет, Раптор,

Вы правы!

Я все еще учусь и пробую несколько способов, чтобы получить то, что мне нужно, и иногда возникают глупые вещи.

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

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

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

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

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

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

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

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

В любом случае это просто слова ограниченного человека...

С наилучшими пожеланиями

Луис

Файлы:
Причина обращения: