Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Привет, коллеги!
Уперся я в этот Binary Indicator и никак не получается робот по нему. Посмотрите, пожалуйста, почему такая лажа выходит, как на картинке?

лажа.jpg
UPDOWN_2.mq4
Binary_Indicator.mq4

Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано


Привет, коллеги!
Уперся я в этот Binary Indicator и никак не получается робот по нему. Посмотрите, пожалуйста, почему такая лажа выходит, как на картинке?


Добрый день!
Один сигнал - одна сделка.
Удачных торгов!

П.С. Рекомендую пересмотреть алгоритм закрытия ордеров, переменные sellticket и byuticket при перезагрузке терминала обнуляются.

UPDOWN_3.mq4

Изменено пользователем SilverKZ
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Спасибо за помощь!
Если я правильно понял, Вы просто условие для входя взяли не цену выше/ниже сигнала, а просто любое не нулевое значение буфера. Надо будет запомнить такой способ.
Кстати, почему-то не все сигналы берет (на скрине)...
А насчет этого Вашего пожелания: "П.С. Рекомендую пересмотреть алгоритм закрытия ордеров, переменные sellticket и byuticket при перезагрузке терминала обнуляются." - я пока еще не так хорошо знаю язык, чтобы решить эту задачу. Буду учиться дальше)

12.jpg

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем привет) Хотел попросить реализовать идею для теста. Смысл прост - если цена колбасится в пределах ~20пп на тф H1 ~6-8 свечей, то она обязательно после этого идет какое-то количество пунктов в одну сторону. Т.е нужно extern'ы тэйка стопа свечей и предела флэта.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

И опять я)
Добрый день.
Уже оперативка дымится: проблема возникла в советнике, после взятия TP или SL, опять открывает ордер!

Не могу придумать условие при котором советник привязывался только ко 2 му бару (после появления сигнала(цвета) от индикатора)

или же , если сработал TP или SL он бы ждал нового сигнала, но только при смене сигнала(цвета) индикатора.

Slope_+бу.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Друзья, изучаю MQL4 и решил написать советник для системы Lazy Trader.
Советник написан, но некорректно работает. Где ошибки - не знаю.
Помогите найти ошибки пожалуйста и дайте обратную связь по коду, который вы видите.

Вот правила системы, для которой я писал советник:

1/ В начале недели дожидаемся закрытия первой четырех-часовой свечи.
2/ Ставим отложенные ордера Buy Stop и Sell Stop на 20 пунктов выше High и на 20 пунктов ниже Low этой свечи.
3/ Стоп-лосс ставится на уровне противоположного ордера. Тейк-профит не ставим.
4/ При достижении ордером прибыли, равной стоп-лоссу, переводим стоп в безубыток (переносим стоп-лосс позиции на цену ее открытия).
5/ Второй ордер после активации первого, НЕ УДАЛЯЕМ!
6/ В конце недели удаляем / закрываем все ордера, независимо от их прибыли / убытка.

Спасибо за помощь:)

Вот ссылка на файл с кодом: _https://www.dropbox.com/s/yg38kci83lzqxu7/Lazy_Trader_Expert.mq4?dl=0

Вот сам код:

extern double Lots = 0.2;
extern int Magic = 209784;
extern int DayTimeOpen = 4;
extern int DayTimeClose = 23;
double SL, maxprice, minprice;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
GetPrice();

if (OrderSellCount() == 0 && OrderSellStopCount() == 0)
{
SL = NormalizeDouble(maxprice + 20*Point, Digits);
ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, Bid, 3, 0, SL, "", Magic, 0, Red);
if (ticket Print("Ошибка открытия ордера по продажу");

if (TimeHour(TimeCurrent()) == DayTimeClose && DayOfWeek() == 5)
{
ticket = OrderClose(ticket, Lots, Bid, 3, Red);
if (ticket == false)
Print("Ордер на продажу не закрыт");
}

}

if (OrderBuyCount() == 0 && OrderBuyStopCount() == 0)
{

SL = NormalizeDouble(minprice - 20*Point, Digits);
ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, Ask, 3, 0, SL, "", Magic, 0, Blue);
if (ticket Print("Ошибка открытия ордера по покупку");

if (TimeHour(TimeCurrent()) == DayTimeClose && DayOfWeek() == 5)
{
ticket = OrderClose(ticket, Lots, Ask, 3, Blue);
if (ticket == false)
Print("Ордер на покупку не закрыт");
}

}

Comment ("MaxPrice:" + DoubleToStr(maxprice,Digits) + "\n"
"MinPrice" + DoubleToStr(minprice,Digits));



}
//+------------------------------------------------------------------+

double GetPrice()
{
if (TimeHour(TimeCurrent()) == DayTimeOpen && DayOfWeek() == 1)
{
minprice = iLow(Symbol(), PERIOD_H4, 0);
maxprice = iHigh(Symbol(), PERIOD_H4, 0);

}
return(maxprice);
return(minprice);
}

int OrderBuyCount()
{
int count = 0;
for(int i = OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
{
count ++;
}

return(count);
}

int OrderBuyStopCount()
{
int count = 0;
for(int i = OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == Magic && OrderType() == OP_BUYSTOP)
{
count ++;
}
return(count);
}

int OrderSellCount()
{
int count = 0;
for(int i = OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
{
count ++;
}

return(count);
}

int OrderSellStopCount()
{
int count = 0;
for(int i = OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == Magic && OrderType() == OP_SELLSTOP)
{
count ++;
}
return(count);
}

Изменено пользователем ivan100096
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Ошибки есть и фактические и логические, вот некоторые:
minprice = iLow(Symbol(), PERIOD_H4, 0); - вы берёте лой новой свечи! а надо 1, я бы ставил эксперта на Н4 и писал так: minprice = Low[1];
Это не будет работать:
return(maxprice);
return(minprice);
т.к. первый return возвращает исполнение кода назад. Я думаю можно обойтись здесь без функции GetPrice(), просто перенесите условие в основной код.

Закрытие ордера внутри условия на открытие - т.е. если ордеров нет - закрываем в пятницу?, внимательнее здесь:
if (OrderBuyCount() == 0 && OrderBuyStopCount() == 0)
{
if (TimeHour(TimeCurrent()) == DayTimeClose && DayOfWeek() == 5)

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Здраствуйте!

Прошу прощения, но скорее всего этот вопрос уже обсуждался но я буду благодарен если ктонибудь всетаки поможет или кинет ссылку на материал.

Вопрос : как получить значение закрытия "прошлой" свечи.
Грубо говоря такая задача - как можно написать код для выставления стоп ордера выше например хая свечи при условии что ее close бы больше ну скажем МА !

?
Спасибо.

void OnTick()
{
PriceMA = iMA(Symbol(), TimeFrame, PeriodMA, 0, MetodMA, Raschet, 1);


if (CountBuy() == 0 && PRICE_CLOSE > PriceMA)
{
OrderBuy = NormalizeDouble(PRICE_HIGH + Filter*Point, Digits);

ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, OrderBuy, Slippage, 0, 0, "MA robot", Magic, 0, Red);

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Здраствуйте!

Прошу прощения, но скорее всего этот вопрос уже обсуждался но я буду благодарен если ктонибудь всетаки поможет или кинет ссылку на материал.

Вопрос : как получить значение закрытия "прошлой" свечи.
Грубо говоря такая задача - как можно написать код для выставления стоп ордера выше например хая свечи при условии что ее close бы больше ну скажем МА !

?
Спасибо.

Спойлер

void OnTick()
{
PriceMA = iMA(Symbol(), TimeFrame, PeriodMA, 0, MetodMA, Raschet, 1);


if (CountBuy() == 0 && PRICE_CLOSE > PriceMA)
{
OrderBuy = NormalizeDouble(PRICE_HIGH + Filter*Point, Digits);

ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, OrderBuy, Slippage, 0, 0, "MA robot", Magic, 0, Red);




Добрый день!
void OnTick()
{
PriceMA = iMA(Symbol(), TimeFrame, PeriodMA, 0, MetodMA, Raschet, 1);
if (CountBuy() == 0 && Close[1] > PriceMA)
{
OrderBuy = NormalizeDouble(High[1] + Filter*Point, Digits);
ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, OrderBuy, Slippage, 0, 0, "MA robot", Magic, 0, Red);
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Даже если реализовать вот такое условие:
"последняя закрытая позиция имеет тип, такой же, какой поступил сигнал, и если эта позиция была закрыта по одному из стоп-приказов, то не открывать позицию."
То остается баг в начале(когда только ставишь советник) ордер открывается не в начале тренда! :(( :(( :(( :(( :((

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

или же , если сработал TP или SL он бы ждал нового сигнала, но только при смене сигнала(цвета) индикатора.



d1w4m3, при каждом открытии ордера по какому-то сигналу индикатора, просто запоминайте тип этого сигнала в переменную. А при открытии каждого нового ордера прописывайте условие:

если текущий сигнал не равен тому, который хранится в переменной, то открывать ордер.

А чтобы не было вот этого:

То остается баг в начале(когда только ставишь советник) ордер открывается не в начале тренда!



Переменной, в которой будете хранить тип последнего сигнала, при объявлении присваивайте значение, которое не будет совпадать ни с одним из возможных сигналов от индикатора.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Решил для себя написать советника помощника.
Пытаюсь торговать по стратегии 20М,для местных это серфинг.Код ниже

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link
#property version "1.00"
#property strict
extern bool TrailingStop=true;
int lMA_period = 10;
int lMA_method =1;
int lMAapplied_price_1=3;
int sMA_period = 10;
int sMA_method =1;
int sMAapplied_price_1=2;
double lMApricelong;
double sMApriceshort;
extern int Delta=5;
//+------------------------------------------------------------------+
//| TrailingPositions
//+------------------------------------------------------------------+
int start()
{
sMApriceshort=NormalizeDouble(iMA(Symbol(),0,sMA_period,0,MODE_EMA,PRICE_HIGH,1),Digits);
lMApricelong=NormalizeDouble(iMA(Symbol(),0,lMA_period,0,MODE_EMA,PRICE_LOW,1),Digits);
double sl;
bool m;
int cnt=OrdersTotal();

for(int i=0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==FALSE) break;
if(OrderSymbol()==Symbol())

if(OrderType()==OP_BUY)
{
sl=NormalizeDouble(lMApricelong-Delta*Point,Digits);
{
if(OrderStopLoss()!=sl)
m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
}
}
}

if(OrderType()==OP_SELL)
{
sl=NormalizeDouble(sMApriceshort+Delta*Point,Digits);
{
if(OrderStopLoss()!=sl)
m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
}
}
return(0);
}

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



Вроде работает на одном из сайтов сказал код сыроватый учите доки вот вся помощь
3. Строка if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==FALSE ) break; допустима, но с точки зрения логики и синаксиса избыточна и не совсем корректна.Может поменять на ticket так как торгую на 10 валютных парах тф Н4
и поиск ордеров проводить по тикету,
4. Условие if(OrderStopLoss()!=sl) некорректно. А как тогда корректно если стоп идёт от ЕМА10? при моих условиях стоп то ставится то удаляется на каждом тике.
Так может здесь кто подскажет

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


или же , если сработал TP или SL он бы ждал нового сигнала, но только при смене сигнала(цвета) индикатора.



d1w4m3, при каждом открытии ордера по какому-то сигналу индикатора, просто запоминайте тип этого сигнала в переменную. А при открытии каждого нового ордера прописывайте условие:

если текущий сигнал не равен тому, который хранится в переменной, то открывать ордер.

А чтобы не было вот этого:

То остается баг в начале(когда только ставишь советник) ордер открывается не в начале тренда!



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

Я Вам оч благодарен, но как это реализовать в коде?
я только дошел до этого
//+--Тип последней закрытой позиции----+
int GetTypeLastClosePos(string sy="", int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal(), r=-1;

if (sy=="0") sy=Symbol();
for (i=0; i if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (mn if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (t t=OrderCloseTime();
r=OrderType();
}
}
}
}
}
return(r);
}
и встал на проблеме как правильно и где задать)))я конечно понимаю что нет ничего сложного, но 2 й день не соображу)
Или дайте хоть видео или литературу почитать на счет этого, а я ток начал этим увлекаться! Изменено пользователем d1w4m3
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
d1w4m3, не надо определять тип последней закрытой позиции. Вы покажите то место, где у Вас ордер по сигналу индикатора открывается.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

день добрый программированию вообще не обучен :(
пожалуйста помогите
может найдётся кто добрый с прямыми руками а не как у меня :) и с пару часов свободного времени
взял тут на форуме индикатор !3 MarketProfile_VirginpPOC
и всё бы хорошо но у него есть две не критичные ошибки declaration of 'StartTime' hides global declaration at line 30
возможно по этому не корректно работает Max_of_days_calculation = 90; // Максимальное количество дней для расчета если -1 вся доступная история
ставлю хоть конкретное число, хоть -1 уровни которые не отработали рисует на данный момент только от 24-25 числа прошлого месяца
как видно из первого скрина указано 240 дней а показывает не более 20 дней
на втором скрине видно не отработанные уровни
хотелось бы что бы рисовал не отработанные уровни за указанное количество дней
ни каких удаление объектов в советниках не включено или разрешено более 240 дней
или я что то не правильно понимаю и в индикаторе так всё и должно быть ?
заранее спасибо откликнувшимся удачи вам и профита

3_MarketProfile_VirginpPOC.mq4
screenshot.jpg
screenshot_1.jpg

Изменено пользователем terminal
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


при каждом открытии ордера по какому-то сигналу индикатора, просто запоминайте тип этого сигнала в переменную.
Вот в этом вся и проблема я не понимаю где конкретно,в коде это сделать! А потом сравнивать с типом ордера?
if(DN_Trend()==true)
{
if(CountSell() == 0 && Bid {
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
if (ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка на продажу");
}
{

if(OrderSelect(ticket, MODE_TRADES)==true)
{
s=OrderType();
}
}
}
мммм я точно что то недогоняю походу(((

Изменено пользователем d1w4m3
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Вот в этом вся и проблема я не понимаю где конкретно,в коде это сделать! А потом сравнивать с типом ордера?



d1w4m3, попробую объяснить схематично, что-бы это также было полезно для остальных обучающихся форумчан. Допустим у вас есть функция, которая генерирует сигналы на покупку и на продажу.
Назовем её int TradeSignal(); Предположим, она возвращает два типа сигнала: OP_BUY - покупка, OP_SELL - продажа. Допустим, у Вас в коде есть условие для открытия позиций:


//покупаем
if(CountBuy() == 0 && TradeSignal()==OP_BUY)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
if (ticket > 0)
{


}
}

//продаем
if(CountSell() == 0 && TradeSignal()==OP_SELL)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
if (ticket > 0)
{


}
}


В том виде, как оно написано выше, новый ордер будет открываться каждый раз сразу после закрытия существующей позиции по SL или TP. Но у нас задача в том, чтобы после закрытия рыночного ордера, следующий открывался по сигналу функции TradeSignal(), отличающегося от того, по которому была закрыта последняя позиция. Т.е. если у нас был закрыт рыночный бай-ордер, то после его закрытия мы должны ждать от сигнальной функции только sell-сигнал и входить только в продажи. Для этого, при открытии каждого нового ордера мы будем запоминать сигнал, полученный от функции TradeSignal().

Вот как это будет выглядеть в коде:
Спойлер

//объявим глобальную переменную, в которую будем запоминать сигнал, по которому был открыт последний ордер
//при объявлении переменной присвоим ей значение, которое функция TradeSignal() вернуть не может (например -1).
//это делается для того, чтобы первый полученный сигнал был обработан, каким бы он ни был (бай или селл)

int LastTradeSignal=-1;


//покупаем

//если в рынке нет бай-ордеров и пришел сигнал бай
if(CountBuy() == 0 && TradeSignal()==OP_BUY)
{
//и если последним был не бай-сигнал
if(LastTradeSignal != OP_BUY)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
if (ticket > 0)
{
//...
//...
//...
//запомним последний сигнал
LastTradeSignal=OP_BUY;
}
}
}

//Для селл тоже самое

//если в рынке нет селл-ордеров и пришел сигнал селл
if(CountSell() == 0 && TradeSignal()==OP_SELL)
{
//и если последним был не селл-сигнал
if(LastTradeSignal != OP_SELL)
{
//открываем селл-ордер
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
if (ticket > 0)
{
//...
//...
//...
//запомним последний сигнал
LastTradeSignal=OP_SELL;
}
}
}


Это очень упрощенный, схематичный вариант, демонстрирующий то, как можно фильтровать, чередовать сигналы и т.п.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Фухх))Спасибо! Где такому научиться не подскажете литературу?
Все разобрался окончательно!
Остался баг "Переменной, в которой будете хранить тип последнего сигнала, при объявлении присваивайте значение, которое не будет совпадать ни с одним из возможных сигналов от индикатора"
у нас -1 и все равно он в начале открывает?
Или есть какая-нибудь возможность привязаться к буферам индикатора, тобишь пока не поступит новый сигнал о смене буфера - не открывать.


Добавлено: 05-05-2017 11:26:39

Новый_точечный_рисунок.jpg

Изменено пользователем d1w4m3
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

TradeSignal() мне нужно написать ее, получается?или это как пример для сигналов?


Функцию я просто так, для примера придумал. У Вас это может быть функция, или просто текущий сигнал индикатора (например iCustom()). Просто на пальцах попытался объяснить.

Фухх))Спасибо! Где такому научиться не подскажете литературу?



Обычная документация по MQL4. :)
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


TradeSignal() мне нужно написать ее, получается?или это как пример для сигналов?


Функцию я просто так, для примера придумал. У Вас это может быть функция, или просто текущий сигнал индикатора (например iCustom()). Просто на пальцах попытался объяснить.

Фухх))Спасибо! Где такому научиться не подскажете литературу?



Обычная документация по MQL4. :)
if(DN_Trend()==true && LastTradeSignal != OP_SELL)
{
if(CountSell() == 0 && Bid {
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
if (ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка на продажу");
LastTradeSignal=OP_SELL;


Добавлено: 05-05-2017 11:56:02

Радует одно что я на правильном пути))Ток знаний не хватает пока. Изменено пользователем d1w4m3
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Остался баг "Переменной, в которой будете хранить тип последнего сигнала, при объявлении присваивайте значение, которое не будет совпадать ни с одним из возможных сигналов от индикатора"
у нас -1 и все равно он в начале открывает?
Или есть какая-нибудь возможность привязаться к буферам индикатора, тобишь пока не поступит новый сигнал о смене буфера - не открывать.



Ну правильно, мы специально присваивали -1, чтобы советник открывался на первом же сигнале, независимо от того какой сигнал с индикатора поступит первым. Если нужно ,чтобы первый сигнал пропускался , то присвойте ей (переменной) значение текущего сигнала индикатора в функции OnInit(). Таким образом на этапе инициализации Вы исключите открытие по текущему сигналу при первом запуске советника.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Ну правильно, мы специально присваивали -1, чтобы советник открывался на первом же сигнале, независимо от того какой сигнал с индикатора поступит первым. Если нужно ,чтобы первый сигнал пропускался , то присвойте ей (переменной) значение текущего сигнала индикатора в функции OnInit(). Таким образом на этапе инициализации Вы исключите открытие по текущему сигналу при первом запуске советника.

А как я узнаю текущий сигнал от индикатора?Когда я включаю советник то он может быть или бай или сел?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

А как я узнаю текущий сигнал от индикатора?Когда я включаю советник то он может быть или бай или сел?


Я так понял, у Вас сигналы приходят из этих функций DN_Trend() и UP_Trend()? Если так, то напишите в OnInit() примерно следующее:

if(DN_Trend()==true) LastTradeSignal=OP_SELL;
if(UP_Trend()==true) LastTradeSignal=OP_BUY;
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

int OnInit()
{ LastTradeSignal=0;
LastTradeSignal=1;
/////////,,
только так заработало, только для села



В общем Вам нужно перечитать все что я писал выше. Вдумчиво перечитать. Я ответил максимально развернуто, как только возможно. Если хотите выйти на нормальный уровень программирования, то не спешите. Не хватайтесь сразу за непосильные вещи, идите от простого к сложному. Если чего то не понимаете, то делайте шаг назад и заново повторяйте. Вы должны научиться четко понимать что, где и почему пишется в коде. Должны самостоятельно научиться делать логические конструкции.
Ну вот что Вы написали здесь? Сначала присваиваете LastTradeSignal=0, а потом тут-же переопределяете значение LastTradeSignal=1. В чем смысл? Я же написал как надо. Где условия, при которых LastTradeSignal принимает то или иное значение?
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...