Открыть противоположный ордер

 

Привет всем,

Хотел бы получить от вас помощь в решении этого вопроса;

Когда ордер открыт и цена ниже цены открытия ордера, я хочу открыть противоположный ордер.

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

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

Луис

double OpenOppositeOrder() 
 {
  int Op;  
 // for(int Counter=0;Counter<=OrdersTotal()-1;Counter++)
  for(int Counter=OrdersTotal()-1;Counter>=0;Counter--)
  {
   OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES);
   {
    if(OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumber)
    {
     Op=OrderType();
     if(Op==OP_BUY && NormalizeDouble(Bid,Digits)*UsePoint<OpenPrice)
     {      
     SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,NormalizeDouble(Bid,Digits),UseSlippage,0,0,"Sell Order",MagicNumber,0,Red);
     if(SellTicket>0)AddLimitsSell();
      }
     if(Op==OP_SELL && NormalizeDouble(Ask,Digits)*UsePoint>OpenPrice)
     {      
     BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,NormalizeDouble(Ask,Digits),UseSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket>0)AddLimitsBuy();
      }
     }
    }
   }
  }
 
luisneves:

Привет всем,

Хотел бы получить от вас помощь в решении этого вопроса;

Когда ордер открыт и цена ниже цены открытия ордера, я хочу открыть противоположный ордер.

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

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

Луис

Не могли бы вы ответить на этот вопрос, это очень поможет вам:

1. Какое возвращаемое значение OrderSelect() - прочитайте документацию OrderSelect, это поможет вам ответить на этот вопрос.

2. Какая ошибка возникает при неудачной отправке заказа?

 
luisneves:

Привет всем,

Хотел бы получить от вас помощь в решении этого вопроса;

Когда ордер открыт и цена ниже цены открытия ордера, я хочу открыть противоположный ордер.

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

Какова цель переменнойUsePoint? Если вы можете объяснить, почему вы используете ее, вы, вероятно, поймете, в чем проблема... также... откуда берется значениеOpenPrice ?


Разве вы не хотите знать, работает ли ваша OrderSend() или нет? и если она не работает, разве вы не хотите знать почему? разве вы не хотите знать, какие соответствующие переменные были, когда она не сработала?

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

 

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

Спасибо за быстрый ответ;

UsePoint - это корректировка на 5 знаков после запятой, поэтому Point*10

OpenPrice - OrderOpenPrice()

Спасибо

Луис

 
luisneves:

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

Спасибо за быстрый ответ;

UsePoint используется для корректировки 5 десятичных знаков, поэтому Point*10.

Можете ли вы объяснить, почему вы используете его в этой ситуации?

 

Привет, RaptorUK,

Вы правы. Мне просто нужно использовать это для TakeProfit и Stoploss (я думаю...).

 
luisneves:

Привет, RaptorUK,

Вы правы. Мне просто нужно использовать это для TakeProfit и Stoploss (я думаю...).

Спасибо, что ответили и подумали об этом :-)
 

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

Я посмотрел на ссылку, которую вы предоставили, и поместил в код рутину ошибки, и ошибка, которая только что вернулась, говорит 2012.11.06 06:40 market order ecn v1 EURUSDi,M5: Order Send failed, error # 4051.

Затем в коде я сделал некоторые изменения в OrderSelect и use Ticket, но все равно ничего не работает. Также я поискал значение и нашел следующее:ERR_INVALID_FUNCTION_PARAMVALUE (4051), и, к сожалению, я не знаю.

как быть дальше...

double OpenOppositeOrder() 
 {
  int Op;  
 // for(int Counter=0;Counter<=OrdersTotal()-1;Counter++)
  for(int Counter=OrdersTotal()-1;Counter>=0;Counter--)
  {
   //OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES);
   OrderSelect(Ticket,SELECT_BY_TICKET);
   {
    if(OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumber)
    {
     Op=OrderType();
     if(Op==OP_BUY && NormalizeDouble(Bid,Digits)<OpenPrice)
     {      
     Ticket = OrderSend(Symbol(),OP_SELL,LotSize,NormalizeDouble(Bid,Digits),UseSlippage,0,0,"Sell Order",MagicNumber,0,Red);
     if(Ticket>0)AddLimitsSell();
      } 
      if( Ticket > 0 )
   {
   Print("Order placed # ", Ticket);
   }
else
   {
   Print("Order Send failed, error # ", GetLastError() );
   }
     if(Op==OP_SELL && NormalizeDouble(Ask,Digits)>OpenPrice)
     {      
     Ticket = OrderSend(Symbol(),OP_BUY,LotSize,NormalizeDouble(Ask,Digits),UseSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(Ticket>0)AddLimitsBuy();
      }
      if( Ticket > 0 )
   {
   Print("Order placed # ", Ticket);
   }
else
   {
   Print("Order Send failed, error # ", GetLastError() );
   }
      
      
     }
    }
   }
  }


 
luisneves:

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

Я посмотрел на ссылку, которую вы предоставили, и поместил в код рутину ошибки, и ошибка, которая только что вернулась, говорит 2012.11.06 06:40 market order ecn v1 EURUSDi,M5: Order Send failed, error # 4051.

Затем в коде я сделал некоторые изменения в OrderSelect и use Ticket, но все равно ничего не работает. Также я поискал значение и нашел следующее:ERR_INVALID_FUNCTION_PARAMVALUE (4051), и, к сожалению, я не знаю.

как быть дальше...

Вам нужно проверить значения, которые вы отправляете в функцию OrderSend()... правильные ли они типы? Например,UseSlippage должно быть int, а звучит как bool ... LotSize это double? находится ли оно в правильном диапазоне ? больше Min Lot и меньше Max Lot и кратно Lot Step ?
 
RaptorUK:
Вам нужно проверить значения, которые вы отправляете в функцию OrderSend() ... правильные ли они типы? Например,UseSlippage должно быть int, а звучит как bool ... LotSize- double? Находится ли оно в правильном диапазоне? Больше Min Lot и меньше Max Lot и кратно Lot Step?


Привет, RaptorUK,

Извините, что отнимаю ваше время, возможно, вы начинаете уставать от меня. Итак, Slippage - int, а LotSize - double.... и все еще плохо....

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

Временами кажется, что это может быть какая-то проблема с тестером, и тогда я пробую на демо. И здесь я не могу открыть противоположный ордер, если цена ниже (для Buy) OrderOpenPrice.

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

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

Заранее благодарю за любую помощь и за ваше терпение.

Луис

Файлы:
 
luisneves:


Привет RaptorUK,

Извините, что отнимаю ваше время, возможно, вы начинаете уставать от меня. Итак, Slippage - int, а LotSize - double.... и все еще плохо....

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

Временами кажется, что это может быть какая-то проблема с тестером, и тогда я пробую на демо. И здесь у меня не получается открыть противоположный ордер, если цена ниже (для Buy) OrderOpenPrice.

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

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

Заранее благодарю за любую помощь и за ваше терпение.

Почему вы изменили правильный код на неправильный?

Ваш цикл перебирал все ордера, которые были в пуле трейдеров (открытые и отложенные ордера)... Теперь этот код не имеет смысла, откуда берется тикет при первом проходе в цикле?

 for(int Counter=OrdersTotal()-1; Counter>=0; Counter--)
  {
   //OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES);
   OrderSelect( Ticket,  SELECT_BY_TICKET);


Еще один вопрос для вас . ... почему эта функция имеет тип double, если она ничего не возвращает?

Причина обращения: