Открытие и закрытие ордеров по условию

 

Друзья помогите дополнить код, я не знаком с функциями OrderSend и CloseOrder. Пробовал сам решить проблему но выходит ерунда.

//----- ОТКРЫТИЕ ОРДЕРОВ
      if(Buf1<0 && Buf2==0)
      {
          Открытие ордера BUY по первому символу
          
          Открытие ордера SELL по второму символу
      }
      else if(Buf1>0 && Buf2==0)
      {
          Открытие ордера SELL по первому символу
          
          Открытие ордера BUY по второму символу
      }
      else;
  
      //----- ЗАКРЫТИЕ ОРДЕРОВ
      if(Buf1==0 && Buf2!=0)
      {
          Закрытие ранее открытых двух ордеров с одинаковым магиком
      }
      else;
  
 
uniface:

Друзья помогите дополнить код, я не знаком с функциями OrderSend и CloseOrder. Пробовал сам решить проблему но выходит ерунда.

Ну так познакомьтесь, когда то же надо начинать... Описание функций с примерами есть в документации или посмотрите как реализовано в библиотеке кодов.

OrderSend - Торговые функции - Справочник MQL4
OrderSend - Торговые функции - Справочник MQL4
  • docs.mql4.com
[in]  Цвет открывающей стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то открывающая стрелка не отображается на графике. При открытии рыночного ордера (OP_SELL или OP_BUY) в качестве цены открытия могут использоваться только самые последние цены Bid (для продажи) или Ask (для покупки). Если операция проводится по...
 
Sergey Kolemanov:

Ну так познакомьтесь, когда то же надо начинать... Описание функций с примерами есть в документации или посмотрите как реализовано в библиотеке кодов.

Да читал я, ни получается ни фига.

Открытие я еще смогу сделать, а вот закрытие  полюбас нет...
 
uniface:

Друзья помогите дополнить код, я не знаком с функциями OrderSend и CloseOrder. Пробовал сам решить проблему но выходит ерунда.

https://www.mql5.com/ru/forum/131859/page9#comment_3359739

Старое, но чтоб разобраться в работе MQL4 хватит!

...upd. Обязательно проштудируйте Учебник
Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 
Vadim Konyaev:

https://www.mql5.com/ru/forum/131859/page9#comment_3359739

Старое, но чтоб разобраться в работе MQL4 хватит!

...upd. Обязательно проштудируйте Учебник
//----- УСЛОВИЕ ЧТОБЫ ОРДЕРА НЕ ДУБЛИРОВАЛИСЬ
      int sellcht = 0;
      int buycht = 0;
      int ordcht = 0;
      for (int i=0; i<OrdersTotal(); i++) 
      {                                               
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) 
          {
              if(OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) 
              {
                  sellcht++;
                  ordcht++;
              }
              if(OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_BUY) 
              {
                  buycht++; 
                  ordcht++;
              }
              if(OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_BUY) 
              {
                  buycht++; 
                  ordcht++;
              }
              if(OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) 
              {
                  sellcht++;
                  ordcht++;
              }
          }
      } 
      
      //----- ОТКРЫТИЕ ОРДЕРОВ
      if(Buf1 == -1.0) //----- 1-SELL, 2-BUY
      {
          if(sellcht==0 && ordcht<2)
          {
              int ticket1=OrderSend(Symbol1,OP_SELL,Lots,Bid,3,0,0,"OP_SELL",Magic,0,clrRed);
              if(ticket1<0) Print("OrderSend завершилась с ошибкой #",GetLastError());
              else Print("Функция OrderSend успешно выполнена");
          }
          //-----
          if(buycht==0 && ordcht<2)
          {
              int ticket2=OrderSend(Symbol2,OP_BUY,Lots,Ask,3,0,0,"OP_BUY",Magic,0,clrBlue);
              if(ticket2<0) Print("OrderSend завершилась с ошибкой #",GetLastError());
              else Print("Функция OrderSend успешно выполнена");
          }
      }
      //-----
      if(Buf1 == 1.0) //----- 1-BUY, 2-SELL
      {
          if(buycht==0 && ordcht<2)
          {
              int ticket1=OrderSend(Symbol1,OP_BUY,Lots,Ask,3,0,0,"OP_BUY",Magic,0,clrBlue);
              if(ticket1<0) Print("OrderSend завершилась с ошибкой #",GetLastError());
              else Print("Функция OrderSend успешно выполнена");
          }
          //-----
          if(sellcht==0 && ordcht<2)
          {
              int ticket2=OrderSend(Symbol2,OP_SELL,Lots,Bid,3,0,0,"OP_SELL",Magic,0,clrRed);
              if(ticket2<0) Print("OrderSend завершилась с ошибкой #",GetLastError());
              else Print("Функция OrderSend успешно выполнена");
          }
      }
      
      //----- ЗАКРЫТИЕ ОРДЕРОВ
      if(Buf1 == 0.0)
      {
          for (int i=0; i<OrdersTotal(); i++)
          {                                               
              if (OrderSelect(i,MODE_TRADES)==true)
              {
                  if (OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) int close = OrderClose(OrderTicket(),OrderLots(),Ask,0,Gray);
                  if (OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_BUY) int close = OrderClose(OrderTicket(),OrderLots(),Bid,0,Gray);
                  if (OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_BUY) int close = OrderClose(OrderTicket(),OrderLots(),Bid,0,Gray);
                  if (OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) int close = OrderClose(OrderTicket(),OrderLots(),Ask,0,Gray);
              } 
              //-----
              if (OrderSelect(i,MODE_TRADES)==true)
              {
                  if (OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) int close = OrderClose(OrderTicket(),OrderLots(),Ask,0,Gray);
                  if (OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_BUY) int close = OrderClose(OrderTicket(),OrderLots(),Bid,0,Gray);
                  if (OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_BUY) int close = OrderClose(OrderTicket(),OrderLots(),Bid,0,Gray);
                  if (OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) int close = OrderClose(OrderTicket(),OrderLots(),Ask,0,Gray);
              }   
          }
      }

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

 
uniface:

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

Для символов, которые отличаются от символа текущего графика, нельзя использовать Bid и Ask текущего символа. Вы же не открываете ордер на EURUSD по цене, взятой с GBPUSD. 

 
Ihor Herasko:

Для символов, которые отличаются от символа текущего графика, нельзя использовать Bid и Ask текущего символа. Вы же не открываете ордер на EURUSD по цене, взятой с GBPUSD. 

MarketInfo(Symbol1,MODE_ASK)

MarketInfo(Symbol2,MODE_BID)

Правильно понимаю?

 
uniface:

MarketInfo(Symbol1,MODE_ASK)

MarketInfo(Symbol2,MODE_BID)

Правильно понимаю?

Да, но лучше (современнее и для кроссплатформенности):

SymbolInfoDouble(Symbol1, SYMBOL_BID)

SymbolInfoDouble(Symbol1, SYMBOL_ASK)

 
Ihor Herasko:

Да, но лучше (современнее и для кроссплатформенности):

SymbolInfoDouble(Symbol1, SYMBOL_BID)

SymbolInfoDouble(Symbol1, SYMBOL_ASK)

А по закрытию сделок будут советы, я честно очень плохо разбираюсь в этом, сделал как мог. И получилось непойми что, с кучей условий. СПАСИБО...

 
uniface:

А по закрытию сделок будут советы, я честно очень плохо разбираюсь в этом, сделал как мог. И получилось непойми что, с кучей условий. СПАСИБО...

Цикл в закрытии неверный.

for (int i=0; i<OrdersTotal(); i++){ 

Нельзя так. Напр, если закрываете 1-й ордер, то нумерация остальных сдвигается. Тот что был 2-м становится 1-м, 3-й становится 2-м и т.д. Получается что таким циклом будете пропускать ордера

for (int i=OrdersTotal()-1; i>=0; i--)

И почему два раза одинаковые условия?

if (OrderSelect(i,MODE_TRADES)==true){
    .......} 
if (OrderSelect(i,MODE_TRADES)==true){
    .......} 
И аналогично, как и в открытии, неверные цены
 
uniface:

А по закрытию сделок будут советы, я честно очень плохо разбираюсь в этом, сделал как мог. И получилось непойми что, с кучей условий. СПАСИБО...

По закрытию первый момент (насчет индексации) уже подсказала Galina. Следующая странность в условии:

OrderSelect(i,MODE_TRADES)==true

Второй аргумент функции должен быть SELECT_BY_POS. MODE_TRADES - это третий аргумент. Странность в том, что в первом цикле OrderSelect() использована правильно, но вот во втором почему-то неправильно.

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