Ваши вопросы по языку MQL4

ksardas

Гуру форума
Подскажите как избавиться от
return value of 'OrderSend' should be checked
return value of 'OrderModify' should be checked
return value of 'OrderClose' should be checked
в блоке открытия ордера

if (MoneyManagement == true) firstlot = GetFirstLot();
else firstlot = Lots;
OrderSend (Symbol(), OP_BUYSTOP, firstlot, Ask+delta*Point, Slippage, 0, 0, "Innos Buy", Magic, exp, Blue);
ticket = GetLastOrderTicket (OP_BUYSTOP);
if (ticket>0)
{
GridBuySL = NormalizeDouble (OrderOpenPrice()-StopLoss*Point, Digits);
if (GridBuySL < OrderOpenPrice())
{
OrderModify (ticket, OrderOpenPrice(), GridBuySL, 0, exp);
Errors = 0;
lastbuylot = OrderLots();
}
else
{
OrderClose (ticket, OrderLots(), OrderOpenPrice(), Slippage);
Errors++;
}
}
 

ansol

Местный знаток
int number = OrderSend(...
Результат ордерсенд - целое число, номер ордера или -1 при ошибке
 

ksardas

Гуру форума
int number = OrderSend(...
Результат ордерсенд - целое число, номер ордера или -1 при ошибке

Как-то так?
PHP:
if (MoneyManagement == true) firstlot = GetFirstLot();
         else firstlot = Lots;
         int number =OrderSend (Symbol(), OP_BUYSTOP, firstlot, Ask+delta*Point, Slippage, 0, 0, "Innos Buy", Magic, exp, Blue);
         ticket = GetLastOrderTicket (OP_BUYSTOP);
           if (ticket>0)
         {
            GridBuySL = NormalizeDouble (OrderOpenPrice()-StopLoss*Point, Digits);
            if (GridBuySL < OrderOpenPrice()) 
            {
               int namber =OrderModify (ticket, OrderOpenPrice(), GridBuySL, 0, exp);
               Errors = 0;
               lastbuylot = OrderLots();
            }
            else 
            { 
               int nomber =OrderClose (ticket, OrderLots(), OrderOpenPrice(), Slippage);
               Errors++;
            }
         }
 

ansol

Местный знаток
Ну, типа, да. Компилируй, увидишь, что таких ошибок не стало
Только
PHP:
         int number =OrderSend (Symbol(), OP_BUYSTOP, firstlot, Ask+delta*Point, Slippage, 0, 0, "Innos Buy", Magic, exp, Blue); 
         ticket = GetLastOrderTicket (OP_BUYSTOP);
У тебя ticket и number должны быть равны, по идее или это чтоб уж совсем-совсем точно было? :)
 

ksardas

Гуру форума
Спасибо, понятно))
а если вместо
PHP:
int namber =OrderModify (ticket, OrderOpenPrice(), GridBuySL, 0, exp);
сделать так
PHP:
if(!OrderModify (ticket, OrderOpenPrice(), GridBuySL, 0, exp)break;
правильней будут??
в обоих случаях ошибки проверки нет:nda:
 

ansol

Местный знаток
Это ж целое число, а не булева переменная, надо if(OrderSend(...) > -1)
потому как !OrderSend будет только в случае нуля, а -1 сработает также как и +1 :(
 

gince

Местный знаток
Привет всем.
Если надо чтоб индикатор работал с 9.00 до 20.00 я вставил в начале старта услувие
PHP:
if(Hour() < 9   || Hour() > 20)return(0);
,
но он все равно рисует за все сутки.
Где моя ошибка ?

PHP:
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
      if(Hour() < 9   || Hour() > 20)return(0); 
      
      int Counted_bars;                       // Количество просчитанных баров 
      Counted_bars=IndicatorCounted(); // Количество просчитанных баров    
      int i=Bars-Counted_bars-1;           // Индекс первого непосчитанного   
      if (i>History-1)                 // Если много баров то ..      
      i=History-1;                     // ..рассчитывать заданное колич.
      while(i>=0)                      // Цикл по непосчит
     ....................................................
..............................................................
      i--;      
      }
//--- return value of prev_calculated for next call
   return(rates_total);
 

ansol

Местный знаток
Если надо чтоб индикатор работал с 9.00 до 20.00 я вставил в начале старта услувие
Надо не возвращать ноль, а в буфер индикатора в это время запихивать ноль, а так он у вас просто не считает с 20 до 9, зато в остальное время (с 9 до 20) всё пересчитывает полностью.
 

gince

Местный знаток
Понял, но несделал.
PHP:
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
     
      
      int Counted_bars;                       // Количество просчитанных баров 
      Counted_bars=IndicatorCounted(); // Количество просчитанных баров    
      int i=Bars-Counted_bars-1;           // Индекс первого непосчитанного   
      if (i>History-1)                 // Если много баров то ..      
      i=History-1;                     // ..рассчитывать заданное колич.
      while(i>=0)                      // Цикл по непосчитанным барам     
      {    
         double MA_l_0 = iMA(NULL,0,perMA_1,0,modeMA_1,PRICE_CLOSE,i);
         double MA_l_1 = iMA(NULL,0,perMA_1,0,modeMA_1,PRICE_CLOSE,i+1);
         
         double MA_g_0 = iMA(NULL,0,perMA_2,0,modeMA_2,PRICE_CLOSE,i);
         double MA_g_1 = iMA(NULL,0,perMA_2,0,modeMA_2,PRICE_CLOSE,i+1);
         
         double STD_0 = iStdDev(NULL,0,perSTD,0,modeSTD,PRICE_CLOSE,i);
         double STD_1 = iStdDev(NULL,0,perSTD,0,modeSTD,PRICE_CLOSE,i+1);
         
         //double ELR_1=((High[i]+Low[i])/2)-iMA(NULL,0,perELR,0,1,PRICE_CLOSE,i);  
         //double ELR_2=((High[i]+Low[i])/2)-iMA(NULL,0,perELR,0,1,PRICE_CLOSE,i+1);
         
         //Buy
         if(MA_l_0 > MA_l_1 && 
            MA_g_0 > MA_g_1 && 
            STD_0 > STD_1)
            
            if(Hour() < 9   || Hour() > 20) UPBuffer[i] = 0;
            else UPBuffer[i] = Low[i];
        else
         //Sell   
         if(MA_l_0 < MA_l_1 && 
            MA_g_0 < MA_g_1 && 
            STD_0 > STD_1 )
            
            if(Hour() < 9   || Hour() > 20) DNBuffer[i] = 0;
            else DNBuffer[i] = High[i];   
      i--;
      
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
Последнее редактирование:

QCKPPS

Прохожий
Could someone post an example of a working solution for MT4 named pipes? Communicated between two terminals. Or any other solution how to make two MT4 terminals communicated with each other?
 

platonov3000

Прохожий
Ребята! Может кто с этим явлением сталкивался? Месяц бьюсь...

В советнике не работает вызванный индикатор, в частности не работают периоды у функции iCustom!
пример:


double Volna = iCustom(NULL,PERIOD_M5,"Awesome",0,0);

у этого индикатора нет входных параметров, но есть 3 буфера. С данным периодом, тестер не видит индикатор, при тестировании на ТФ М1. Работает только "0 или PERIOD_CURRENT" (текущий период). !!!!!!! Это происходит с любым вызванным индикатором, история тестируемого участка на всех ТФ есть.Проверяю так... (по быстрому). Включаю старт тестирования с периодом М1, потом стоп, если тестер не видит индикатор, то тот не отображается на графике. Если меняю период на простой "0" в советнике, то индикатор прекрасно отображается на графике после тестирования.
Программирование только начинаю изучать, но хоть убей, не могу понять поведение данной функции, она и работает и не работает....
Может хоть у кого нибудь зацепка есть, узнать причину?
 
Последнее редактирование:

qqmber

Почетный гражданин
Проверяю так... (по быстрому). Включаю старт тестирования с периодом М1, потом стоп, если тестер не видит индикатор, то тот не отображается на графике. Если меняю период на простой "0" в советнике, то индикатор прекрасно отображается на графике после тестирования.
Вы чего-то странного желаете - увидеть индикатор с периодом М5 на графике М1. Не будет он отображаться, и не должен, но это совершенно не мешает использовать в коде его значения.
 

ksardas

Гуру форума
Нужна помощь!!!!
не понимаю, что возвращать внутри void
PHP:
void TrailingByMA(int iTicket=0,int iMATmFrme=-1)
{
   // проверяем переданные значения
   if ((iTicket==0) || (!OrderSelect(iTicket,SELECT_BY_TICKET)) || (iMATmFrme==-1) )
   {
      Alert("Трейлинг функцией TrailingByMA() невозможен из-за некорректности значений переданных ей аргументов.");
    // если условия не походят нужно выйти 
      return(0);
...далее сам тралл
   }
return(0) не правильно, что-же ставить на возврат????
 

Ugar

Гуру форума
Нужна помощь!!!!
не понимаю, что возвращать внутри void
PHP:
void TrailingByMA(int iTicket=0,int iMATmFrme=-1)
{
   // проверяем переданные значения
   if ((iTicket==0) || (!OrderSelect(iTicket,SELECT_BY_TICKET)) || (iMATmFrme==-1) )
   {
      Alert("Трейлинг функцией TrailingByMA() невозможен из-за некорректности значений переданных ей аргументов.");
    // если условия не походят нужно выйти 
      return(0);
...далее сам тралл
   }
return(0) не правильно, что-же ставить на возврат????
void функция ничего не возвращает.
Можно убрать return(0); в конце функции. А если нужно выйти из функции return;
 

ksardas

Гуру форума
void функция ничего не возвращает.
Можно убрать return(0); в конце функции. А если нужно выйти из функции return;
Помню что void функция ничего не возвращает, просто поставить return(без аргументов) для выхода затупил, в других местах наоборот добавлял аргументы(0) . Благодарю за помощь!!!:)
 

platonov3000

Прохожий
Вы чего-то странного желаете - увидеть индикатор с периодом М5 на графике М1. Не будет он отображаться, и не должен, но это совершенно не мешает использовать в коде его значения.
Спасибо друг, поправил меня! Я этого не знал.
 

ansol

Местный знаток
Каким образом в тестере может возникнуть ошибка 138 при
PHP:
fClose = OrderClose(OrderTicket(), OrderLots(), dPrice, iPips, clrNONE);
где iPips = 10 на 5знаке(ноль тоже пробовал) и dPrice = Ask при типе ордера BUY и Bid при SELL
Начал переделывать свой же советник и содрал эту функцию с него, а оно мне фигу такую в логах пишет:
Код:
2014.07.11 14:10:59.238	2014.06.13 06:21  ZZScalp EURUSD,M5: OrderClose error 138
2014.07.11 14:10:59.238	2014.06.13 06:21  ZZScalp EURUSD,M5: error(138): requote #1 ZigZag-27
При этом старая версия работает прекрасно здесь же
 
Верх