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

 

Народ такой вопрос есть - как в одномерный массив засунуть значения переменной?

В хелп не отправляйте - там для подобной задачи примера НЕТ.


Допустим есть переменная a, которая меняется при определённых условиях.

Мне нужно, что-бы в массив записывались 3 последних значения этой переменной. Как это реализуется в mql4 ?


Пишу    int mas[3];

mas[]=a;    внутри цикла после условия, при котором а меняется,

но нифига не работает, хотя логически должно.  компилятор выдаёт    ']' - expression expected, хочет что-бы я в mas[]=a  внутри скобок засунул какое-то неведомое выражение.

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


 
Igor Makanu:

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

если поняли о чем идет речь, то Вы можете приведенный мной код еще немного доработать, я про вынос в отдельное условие if(OrderType()==OP_BUY....

затем будет намного проще найти логические ошибки, имхо

Вставите после каждого OrderSend => return

либо сделайте выбор через switch :

switch ( OrderType() )
{ OP_BUY : { if (1) { .... break; }
             if (2) { .... break; }
           }
  OP_SELL : { if (3) { .... break; }
              if (4) { .... break; }
            }
}
 
Vladimir Tkach:

Пробую так и не получается.

у Вас в вызове пользовательского индикатора мало входных параметров - посчитайте сколько в индикаторе Morning Flat внешних переменных? (extern) - вот столько же параметров Вы должны передавать при использовании iCustom

 
John Smith:
.....

Пишу    int mas[3]=a;    внутри цикла после условия, при котором а меняется,

но нифига не работает, хотя логически должно.

Научитесь делать все действия не сразу, а шаг за шагом .

Пример :

int mas[3]={0}; // инициализация масива 

.....           // основной код
if ( найдена новая величина а )
{ mas[2]=mas[1];  // самая старая величина а
  mas[1]=mas[0];
  mas[0]=a;       // новая величина а
}
.....           // основной код
 
Igor Makanu:

у Вас в вызове пользовательского индикатора мало входных параметров - посчитайте сколько в индикаторе Morning Flat внешних переменных? (extern) - вот столько же параметров Вы должны передавать при использовании iCustom

Я их уже все перебрал.

Решил вопрос по другому. Вставил код вычисления цен из индикатора в эксперт.

 
Igor Makanu:

именно так и есть - логика кода одинакова, просто если дробить условия, то быстрее находишь где логическая ошибка , ну и в Вашем случае, если вынести: 

в отдельное условие, получим оптимизацию кода - условие будет проверенно один раз, а не 4 раза как в Вашем примере.

Оформите вывод в журнал экспертов через

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

Спасибо за ответ. Раздробил условия до предела. Комментариями проверил логику. Оказалось, что закрытие позиций происходит по условиям закрытия первой открытой позиции. То есть, если сначала открыли БАЙ или СЕЛЛ с условием на закрытие 1, а потом открылась вторая такая же позиция, но с условием на закрытие 2, то это условие закрытия игнорируется и вторая позиция, не смотря на другой магик, закрывается тоже по условию 1. И что делать?

 
Vladimir Tkach:

Я их уже все перебрал.

Решил вопрос по другому. Вставил код вычисления цен из индикатора в эксперт.

ну так значит так, я обратил внимание, что Вы iCustom() не правильно вызывали, должно было так быть:

min=iCustom(Symbol(),0,"Morning Flat",StartHour,EndHour,TargetLevel,UpColor,DnColor,TargetUpColor,TargetDnColor,1,0);

я передаю при вызове индикатора 7 параметров, а Вы вызывали с 3-мя параметрами

я бы оставил вызов индикатора, но модифицировал бы сам индикатор - убрал бы в коде индикатора лишние внешние переменные и графические объекты 


novichok2018:

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

мои поздравления! Вы на верном пути, но лучше на этапе отладки выводить не в комментарий( Commetn() ), а в журнал (Print())

код покажите

 
Igor Makanu:

ну так значит так, я обратил внимание, что Вы iCustom() не правильно вызывали, должно было так быть:

я передаю при вызове индикатора 7 параметров, а Вы вызывали с 3-мя параметрами

я бы оставил вызов индикатора, но модифицировал бы сам индикатор - убрал бы в коде индикатора лишние внешние переменные и графические объекты 


мои поздравления! Вы на верном пути, но лучше на этапе отладки выводить не в комментарий( Commetn() ), а в журнал (Print())

код покажите

 int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(TimeCurrent()>OrderOpenTime()+100)
           { 
            if(OrderType()==OP_BUY)
              {
               if(OrderMagicNumber==101)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<20) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 }
              }
                 
            if(OrderType()==OP_SELL)
              {
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>97.55)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 } 
              }
            }               
         }
       continue;  
      }   

Принты убрал.

 
novichok2018:

Принты убрал.

не знаю всю логику Вашего кода, но однозначно Вам необходимо после каждого закрытия ордера выполнять выход из цикла через break; и на следующем тике опять проверять ордера на Ваши условия - я не знаю как ведет себя OrderSelect() после закрытия ордера - если ордер закрыт, то что то же выбрано? или будет ошибка?

тут в принципе у Вас проблема в том, что Вы хотите в одном цикле все сразу проверить и закрыть, решений несколько: используйте 

switch()

или оформите закрытие ордера в функцию (есть готовые функции для  ордеров https://www.mql5.com/ru/forum/131859/page2#434206 )

или используйте break после закрытия ордера в Вашем коде

Полезные функции от KimIV
Полезные функции от KimIV
  • 2008.03.11
  • www.mql5.com
В этой теме я буду выкладывать коды своих функций на языке программирования MQL4, приводить примеры их использования и отвечать на вопросы, связанн...
 
Igor Makanu:

не знаю всю логику Вашего кода, но однозначно Вам необходимо после каждого закрытия ордера выполнять выход из цикла через break; и на следующем тике опять проверять ордера на Ваши условия - я не знаю как ведет себя OrderSelect() после закрытия ордера - если ордер закрыт, то что то же выбрано? или будет ошибка?

тут в принципе у Вас проблема в том, что Вы хотите в одном цикле все сразу проверить и закрыть, решений несколько: используйте 

switch()

или оформите закрытие ордера в функцию (есть готовые функции для  ордеров https://www.mql5.com/ru/forum/107476 )

или используйте break после закрытия ордера в Вашем коде

Спасибо. break вроде помогло. Посмотрим, что будет дальше.

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