Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 100
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Привет всем, помогите пожалуйста найти ошибку в коде советника, вроде всё просмотрел, в коде вроде написано всё правильно, но программа почему-то торгует некорректно! Идея такая: Советник должен искать две длинные свечи одного направления (длинна между свечей регулируется в советнике, то есть между двух минимумов или максимумов свечей в зависимости от направления), если цена в противоположную сторону пробивает минимум или максимум последней свечи, должна открываться сделка (Пример фото ситуаций на графике прикрепил в файле). Советник должен открывать сделки при каждой такой подходящей ситуации, а он почему-то открывает сделки только на торговых окнах между дней. Вот такая ситуация, кому не сложно из программеров, помогите пожалуйста, исправьте ошибку. Код советника смотрите ниже, а также в прикреплённом файле.
//+-----------------------------------------------------------------------------------------------+
//| 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);
}
}
}
}
//+-----------------------------------------------------------------------------------------------+
Привет всем, помогите пожалуйста найти ошибку в коде советника, вроде всё просмотрел, в коде вроде написано всё правильно, но программа почему-то торгует некорректно! Идея такая: Советник должен искать две длинные свечи одного направления (длинна между свечей регулируется в советнике, то есть между двух минимумов или максимумов свечей в зависимости от направления), если цена в противоположную сторону пробивает минимум или максимум последней свечи, должна открываться сделка (Пример фото ситуаций на графике прикрепил в файле). Советник должен открывать сделки при каждой такой подходящей ситуации, а он почему-то открывает сделки только на торговых окнах между дней. Вот такая ситуация, кому не сложно из программеров, помогите пожалуйста, исправьте ошибку. Код советника смотрите ниже, а также в прикреплённом файле.
Может достаточно уже, вы наплодили постов в каждой теме, и при этом создали свою.
Привет.
Подскажите как ограничить торговлю советника по времени.
Перепробовал множество способов с форума но так ничего не получилось, в написании совсем ничего не понимаю.
Желательно прямо пальцем тыкнуть куда что вставить.
встав это после start. и ехперт будет торговать каждый день в заданном интервале времени по терминалу
Привет всем, помогите пожалуйста найти ошибку в коде советника, вроде всё просмотрел, в коде вроде написано всё правильно, но программа почему-то торгует некорректно! Идея такая: Советник должен искать две длинные свечи одного направления (длинна между свечей регулируется в советнике, то есть между двух минимумов или максимумов свечей в зависимости от направления), если цена в противоположную сторону пробивает минимум или максимум последней свечи, должна открываться сделка (Пример фото ситуаций на графике прикрепил в файле). Советник должен открывать сделки при каждой такой подходящей ситуации, а он почему-то открывает сделки только на торговых окнах между дней. Вот такая ситуация, кому не сложно из программеров, помогите пожалуйста, исправьте ошибку. Код советника смотрите ниже, а также в прикреплённом файле.
проверь условие для входа в buy и sell
Привет всем, помогите пожалуйста найти ошибку в коде советника, вроде всё просмотрел, в коде вроде написано всё правильно, но программа почему-то торгует некорректно! Идея такая: Советник должен искать две длинные свечи одного направления (длинна между свечей регулируется в советнике, то есть между двух минимумов или максимумов свечей в зависимости от направления), если цена в противоположную сторону пробивает минимум или максимум последней свечи, должна открываться сделка (Пример фото ситуаций на графике прикрепил в файле). Советник должен открывать сделки при каждой такой подходящей ситуации, а он почему-то открывает сделки только на торговых окнах между дней. Вот такая ситуация, кому не сложно из программеров, помогите пожалуйста, исправьте ошибку. Код советника смотрите ниже, а также в прикреплённом файле.
Лучше сначала написать часть советника, чтоб отмечал на графике найденные свечи - все ясно станет. И следующие строчки в Вашем случае лишние:
Прошу помощи сообщества ...
*
Скачал на форуме индикатор Фильтр Кальмана (приложен исходник).
На графике все хорошо.
При попытке чтения в эксперте вот такой строкой
iValue=iCustom(NULL,timeframe,"Kalmanfilter", 4,1,1 ,0,1);
выводит какое-то одно и то же большое число, явно не имеющее отношение к индикатору:
Что это может быть ?
Прошу помощи сообщества ...
*
Скачал на форуме индикатор Фильтр Кальмана (приложен исходник).
На графике все хорошо.
При попытке чтения в эксперте вот такой строкой
iValue=iCustom(NULL,timeframe,"Kalmanfilter", 4,1,1 ,0,1);
выводит какое-то одно и то же большое число, явно не имеющее отношение к индикатору:
Что это может быть ?
EMPTY_VALUE
Пустое значение в индикаторном буфере
2147483647 (0x7FFFFFFF)
EMPTY_VALUE
Пустое значение в индикаторном буфере
2147483647 (0x7FFFFFFF)
:) Это я уже нашёл ...
А почему оно выходит ?
:) Это я уже нашёл ...
А почему оно выходит ?
Индикатор имеет 2 массива, потому что 2 цвета. Пока на баре линия первого цвета, массив со вторым цветом равен EMPTY_VALUE,
то есть если после запроса iValue=iCustom(NULL,timeframe,"Kalmanfilter", 4,1,1 ,0,1);
iValue = EMPTY_VALUE, значит линия на 1 баре оранжевая. (потому что массив синего = EMPTY_VALUE)
Индикатор имеет 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 используется не только для рисования, но и участвует в расчете индикатора ...