Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 128

 
Anatoliy Ryzhakov:

        Ордер на продажу закрывается по цене Ask

Немного не понял! Тыкните пальцем где касяк в коде!!! (в журнале говорит ORDER CLOSE ERROR 4108) Заранее благодарен!

 

День добрый Знатоки! Отмучились в самый трудный день в году? Можно делом заняться? ;=).

Нарисовал советника, все хорошо, но MQL  как   акя понимаю работает в среде MT4. А мне нужно чтобы он работал с ПО которое работает напрямую с биржей. Есть ли другие компиляторы MQL? И если нет, то на каком языке лучше переписать советника.

 
STARIJ:

у Вас стоит break а нужно continue

     У меня нет break. По каким причинам советник может не "видеть" свои ордера? У меня время сервера и компьютера разные.Может поэтому?

 
Anatoliy Ryzhakov:  У меня нет break. По каким причинам советник может не "видеть" свои ордера? У меня время сервера и компьютера разные.Может поэтому?

Время у всех разное. Начните без спешки издалека. 1. Проверьте, что дает Вам функция OrdersTotal. Учтите, что ее значение зависит от настройки истории: Сегодня, последние 3 дня, последняя неделя, ...  Настройте так, как удобнее.     2. Потом устройте цикл и выведите Магики всех ордеров с помощью Alert. и так далее. Это называется отладка - очень важная часть работы программиста. Более важная, чем написать код.

 
Подскажите пожалуйста как можно исправить ошибку  invalid lots amount for FreeMarginCheck function в советнике, при случайной установке отрицательного значения объёма (лота). Чтобы было сообщение о неправильном лоте, без сообщения об ошибке, в тестере .

 
STARIJ:

Время у всех разное. Начните без спешки издалека. 1. Проверьте, что дает Вам функция OrdersTotal. Учтите, что ее значение зависит от настройки истории: Сегодня, последние 3 дня, последняя неделя, ...  Настройте так, как удобнее.     2. Потом устройте цикл и выведите Магики всех ордеров с помощью Alert. и так далее. Это называется отладка - очень важная часть работы программиста. Более важная, чем написать код.

   Спасибо !

 

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

Вот моё условие

if(MA_1>MA_2)
ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);

Мне советовали использовать функцию ( OrdersTotal() ) но она не подходит в моём случае. Я записал так

void OnTick()
  {
//---
   double MA_1;
   MA_1=iMA(_Symbol,0,1,0,1,0,0);
   double MA_2;
   MA_2=iMA(_Symbol,0,6,0,1,0,0);
   int ticket=0;
   if(OrdersTotal()<=3)
     {
      if(MA_1>MA_2)
         ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
      if(MA_1<MA_2)
         ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);
     }
//---
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

Компилируется ошибок нет но это не для моего случая данная функция.

Я нашёл такой код 

#property copyright "Влад Сергеев для mmgp" 
#property version   "1.00" 
#property strict 
#property script_show_inputs 

input int      orders = 4;      //всего ордеров в серии 
input bool     buy = true;      //флаг разрешающий/запрещающий покупки 
input bool     sell = false;    //флаг разрешающий/запрещающий продажи 
input int      magic = 100500;  //уникальный номер для ордеров, открываемых этим скриптом 
input double   lot = 0.01;      //объем каждого ордера серии 
input int      tp = 100;        //тейк профит, в пунктах 
input int      sl = 100;        //стоп лосс, в пунктах 
input int      slip = 2;        //допустимое проскальзывание на открытии, в пунктах (для ECN, где открытие по рынку - игнор) 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int i=0;  // для чего эта переменная
   int ticket=0;
   if(buy) 
     {
      while(i<orders) // здесь эта переменная используется чтобы сравнивать ордера или для чего
        {
         RefreshRates(); // если убрать эту функцию коду хуже не становится
         ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slip,0,0,"",magic,0,clrBlue); //здесь понятно
         if(ticket!=-1) // эта строчка тоже не понятна
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  // функция для выбора ордера это логично но тоже не понятно как ей пользоваться
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl*Point,Digits),NormalizeDouble(OrderOpenPrice()+tp*Point,Digits),0,clrBlue);
               // эту строчку тоже хотел бы чтобы объяснили
              }
           }
         i++; // что увеличивается на оду единицу это относится к магическому номеру ордера чтобы программа понимала что у неё есть ордера
        }
     }
   i=0;
   if(sell) // прошлая запись была для покупак эта для продаж 
     {
      while(i<orders) 
        {
         RefreshRates();
         ticket=OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slip,0,0,"",magic,0,clrRed);
         if(ticket!=-1) 
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl*Point,Digits),NormalizeDouble(OrderOpenPrice()-tp*Point,Digits),0,clrRed);
              }
           }
         i++;
        }
     }
  }  
//+------------------------------------------------------------------+

Может его можно использовать только мне не понятны значения строк. Можно использовать этот код если его переделать под моё условие? 

 
Seric29:

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

Вот моё условие

Мне советовали использовать функцию ( OrdersTotal() ) но она не подходит в моём случае. Я записал так

Компилируется ошибок нет но это не для моего случая данная функция.

Я нашёл такой код 

Может его можно использовать только мне не понятны значения строк. Можно использовать этот код если его переделать под моё условие? 

Попробуйте так

pos=0; //счётчик ордеров

for(int i=OrdersTotal()-1;i>=0;i--) // пребираем рыночные ордера

    {

   if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;//выбираем из рыночных

     { 

   if (OrderSymbol()!=Symbol()&&OrderMagicNumber()!=Magic) continue;//выбираем только ордера советника (если есть Magic и он торгует на     любой валютной паре)

      pos++; //если выбрали увеличиваем pos на единицу

                                            

   }

   }

 if(MA_1>MA_2&&pos<3)
 OrderSend(_Symbol(),OP_BUY,Lots,Ask,0,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,clrGreen);
 if(MA_1<MA_2&&pos<3)
 OrderSend(_Symbol(),OP_SELL,Lots,Bid,0,Bid+SL*Point,Bid-TP*Point,NULL,Magic,0,clrRed);

 
Весьма интересный форум. много чего поучительного!)
 
Seric29:

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

if(MA_1>MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-(i==0?SL_1:i==1?SL_2:SL_3)*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+(i==0?SL_1:i==1?SL_2:SL_3)*Point,Ask-TP*Point,NULL,0,0,clrRed);
Причина обращения: