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

 

Привет всем, помогите пожалуйста найти ошибку в коде советника, вроде всё просмотрел, в коде вроде написано всё правильно, но программа почему-то торгует некорректно! Идея такая: Советник должен искать две длинные свечи одного направления (длинна между свечей регулируется в советнике, то есть между двух минимумов или максимумов свечей в зависимости от направления), если цена в противоположную сторону пробивает минимум или максимум последней свечи, должна открываться сделка (Пример фото ситуаций на графике прикрепил в файле). Советник должен открывать сделки при каждой такой подходящей ситуации, а он почему-то открывает сделки только на торговых окнах между дней. Вот такая ситуация, кому не сложно из программеров, помогите пожалуйста, исправьте ошибку. Код советника смотрите ниже, а также в прикреплённом файле.


//+-----------------------------------------------------------------------------------------------+

//|                                                                           Spacing_Candles.mq4 |

//|                                                                        Copyright 2017, Vladim |

//|                                                                            vk.com/id229534564 |

//|                                                                  Mail: Vladim120385@yandex.ru |

//+-----------------------------------------------------------------------------------------------+

#property copyright "Copyright 2017, Vladim"

#property link      "vk.com/id229534564"

#property version   "1.00"

#property strict


//--- параметры советника

extern string paramEA    = "";     // Parameters EA

extern double volume     = 0.01;   // Volume

extern double stopLoss   = 5;      // StopLoss

extern double takeProfit = 1.5;    // TakeProfit

extern double maxSpacing = 150;    // MaxSpacing

extern double minSpacing = 30;     // MinSpacing

extern double TrailingStop  = 0;   // TrailingStop

extern int    magic      = 127;    // Magic


//--- глобальные переменные

datetime newCandle;

int tip;


//+-----------------------------------------------------------------------------------------------+

int OnInit()

{

   

   return(INIT_SUCCEEDED);

}

//+-----------------------------------------------------------------------------------------------+

void OnDeinit(const int reason)

{

   

}

//+-----------------------------------------------------------------------------------------------+

void OnTick()

{

   if(newCandle != Time[0]) FindPattern();

   newCandle = Time[0];

}

//+-----------------------------------------------------------------------------------------------+

void OpenOrder(int type)   // Откроем рыночный ордер

{

   if(type == OP_BUY)  if(OrderSend(_Symbol, OP_BUY,  volume, Ask, 0, 0, 0, "", magic, 0)) SetSLTP(OP_BUY);

   if(type == OP_SELL) if(OrderSend(_Symbol, OP_SELL, volume, Bid, 0, 0, 0, "", magic, 0)) SetSLTP(OP_SELL);

}

//+-----------------------------------------------------------------------------------------------+

void SetSLTP(int type)   // Установим стоп приказы

{

   double sl = 0;

   double tp = 0;

   

   if(type == OP_BUY)

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

         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

            if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_BUY && OrderStopLoss() == 0)

            {

               sl = NormalizeDouble(Low[1] - stopLoss * _Point, _Digits);

               tp = NormalizeDouble(OrderOpenPrice() + (OrderOpenPrice() - Low[1]) * takeProfit, Digits);

               if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) return;

            }

   if(type == OP_SELL)

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

         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

            if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_SELL && OrderStopLoss() == 0)

            {

               sl = NormalizeDouble(High[1] + stopLoss * _Point, _Digits);

               tp = NormalizeDouble(OrderOpenPrice() - (High[1] - OrderOpenPrice()) * takeProfit, Digits);

               if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) return;

            }

}

//+-----------------------------------------------------------------------------------------------+

void FindPattern()   // Ищем большое расстояние между свечами

{

   if(High[1] < High[2] && Bid > High[1] && Low[1] < Low[2])

   {

      double spacing = NormalizeDouble((High[2] - High[1]) / _Point, 0);

            

      if(maxSpacing >= spacing && minSpacing <= spacing)

         OpenOrder(OP_BUY);

   }

   if(Low[1] > Low[2] && Bid < Low[1] && High[1] > High[2])

   {

      double spacing = NormalizeDouble((Low[1] - Low[2]) / _Point, 0);

            

      if(maxSpacing >= spacing && minSpacing <= spacing)

         OpenOrder(OP_SELL);

   }   

   {

      if (TrailingStop!=0) TrailingStop();      

   }

}

//+-----------------------------------------------------------------------------------------------+

void TrailingStop()

{

   double StLo,OSL,OOP;

   bool error=true;   

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

   {

      if (OrderSelect(i, SELECT_BY_POS))

      {

         tip = OrderType();

         if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

         {

            OSL   = NormalizeDouble(OrderStopLoss(),Digits);

            OOP   = NormalizeDouble(OrderOpenPrice(),Digits);

            if (tip==0)        

            {  

               StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits);

               if (StLo < OOP) continue;

               if (StLo > OSL)

                  error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);


            }                                         

            if (tip==1)    

            {                                         

               StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits);           

               if (StLo > OOP) continue;

               if (StLo < OSL || OSL==0 )

                  error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);

            } 

            if (!error) Alert("Error TrailingStop ",GetLastError(),"   ",Symbol(),"   SL ",StLo);

         }

      }

   }

}

//+-----------------------------------------------------------------------------------------------+ 

Файлы:
 
Vladim1203:

Привет всем, помогите пожалуйста найти ошибку в коде советника, вроде всё просмотрел, в коде вроде написано всё правильно, но программа почему-то торгует некорректно! Идея такая: Советник должен искать две длинные свечи одного направления (длинна между свечей регулируется в советнике, то есть между двух минимумов или максимумов свечей в зависимости от направления), если цена в противоположную сторону пробивает минимум или максимум последней свечи, должна открываться сделка (Пример фото ситуаций на графике прикрепил в файле). Советник должен открывать сделки при каждой такой подходящей ситуации, а он почему-то открывает сделки только на торговых окнах между дней. Вот такая ситуация, кому не сложно из программеров, помогите пожалуйста, исправьте ошибку. Код советника смотрите ниже, а также в прикреплённом файле.

Может достаточно уже, вы наплодили постов в каждой теме, и при этом создали свою.

 
kuzhakov:

Привет.
Подскажите как ограничить торговлю советника по времени.
Перепробовал множество способов с форума но так ничего не получилось, в написании совсем ничего не понимаю.
Желательно прямо пальцем тыкнуть куда что вставить.


встав это после start. и ехперт будет торговать каждый день в заданном интервале времени по терминалу


int val=Hour();
 double min=Minute();
 double Dl = val + min/100;  
 double L = xxxx+xxxx/100; //час + минуты вместо хххх - это начало времени
 double P = xxxx+xxxx/100; //час + минуты вместо хххх - это конец времени
 if(Dl<L)return;
 if(Dl>P)return;
 
Vladim1203:

Привет всем, помогите пожалуйста найти ошибку в коде советника, вроде всё просмотрел, в коде вроде написано всё правильно, но программа почему-то торгует некорректно! Идея такая: Советник должен искать две длинные свечи одного направления (длинна между свечей регулируется в советнике, то есть между двух минимумов или максимумов свечей в зависимости от направления), если цена в противоположную сторону пробивает минимум или максимум последней свечи, должна открываться сделка (Пример фото ситуаций на графике прикрепил в файле). Советник должен открывать сделки при каждой такой подходящей ситуации, а он почему-то открывает сделки только на торговых окнах между дней. Вот такая ситуация, кому не сложно из программеров, помогите пожалуйста, исправьте ошибку. Код советника смотрите ниже, а также в прикреплённом файле.


проверь условие для входа в buy  и sell

 
Vladim1203:

Привет всем, помогите пожалуйста найти ошибку в коде советника, вроде всё просмотрел, в коде вроде написано всё правильно, но программа почему-то торгует некорректно! Идея такая: Советник должен искать две длинные свечи одного направления (длинна между свечей регулируется в советнике, то есть между двух минимумов или максимумов свечей в зависимости от направления), если цена в противоположную сторону пробивает минимум или максимум последней свечи, должна открываться сделка (Пример фото ситуаций на графике прикрепил в файле). Советник должен открывать сделки при каждой такой подходящей ситуации, а он почему-то открывает сделки только на торговых окнах между дней. Вот такая ситуация, кому не сложно из программеров, помогите пожалуйста, исправьте ошибку. Код советника смотрите ниже, а также в прикреплённом файле.

Лучше сначала написать часть советника, чтоб отмечал на графике найденные свечи - все ясно станет. И следующие строчки в Вашем случае лишние:

extern string paramEA    = "";     // Parameters EA

и

//+-----------------------------------------------------------------------------------------------+
int OnInit()
{
   
   return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   
}
//+-----------------------------------------------------------------------------------------------+
 

Прошу помощи сообщества ...
*
Скачал на форуме индикатор Фильтр Кальмана (приложен исходник).
На графике все хорошо.


При попытке чтения в эксперте вот такой строкой



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

выводит какое-то одно и то же большое число, явно не имеющее отношение к индикатору:

Что это может быть ?

Файлы:
 
MikeZv:

Прошу помощи сообщества ...
*
Скачал на форуме индикатор Фильтр Кальмана (приложен исходник).
На графике все хорошо.


При попытке чтения в эксперте вот такой строкой



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

выводит какое-то одно и то же большое число, явно не имеющее отношение к индикатору:

Что это может быть ?

EMPTY_VALUE

Пустое значение в индикаторном буфере

2147483647 (0x7FFFFFFF)

 
Alekseu Fedotov:

EMPTY_VALUE

Пустое значение в индикаторном буфере

2147483647 (0x7FFFFFFF)


:) Это я уже нашёл ...
А почему оно выходит ?

 
MikeZv:

:) Это я уже нашёл ...
А почему оно выходит ?


 Индикатор имеет 2 массива, потому что 2 цвета. Пока на баре линия первого цвета, массив со вторым цветом равен EMPTY_VALUE,

то есть если после запроса iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);  

iValue =  EMPTY_VALUE, значит линия на 1 баре оранжевая. (потому что массив синего = EMPTY_VALUE)

 
Nikolay Ivanov:

 Индикатор имеет 2 массива, потому что 2 цвета. Пока на баре линия первого цвета, массив со вторым цветом равен EMPTY_VALUE,

то есть если после запроса iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);  

iValue =  EMPTY_VALUE, значит линия на 1 баре оранжевая. (потому что массив синего = EMPTY_VALUE)


Спасибо,Николай...
Я брал и с той и с другой линии. 
Потом я объединил их в одну (оставил один буфер). Тот же результат.
*
Возник такой вопрос:
В индикаторе есть переменная draw_begin=500, т.е. количество свечек с конца (с самой свежей свечи), на которых рисуется график.
А когда мы извлекаем значение индикатора способом iCustom(), вот эти 500 штук с какой свечи отсчитываются ?
Почему это важно - draw_begin используется не только для рисования, но и участвует в расчете индикатора  ...

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