Привет, коллеги!
Уперся я в этот Binary Indicator и никак не получается робот по нему. Посмотрите, пожалуйста, почему такая лажа выходит, как на картинке?
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Привет, коллеги!
Уперся я в этот Binary Indicator и никак не получается робот по нему. Посмотрите, пожалуйста, почему такая лажа выходит, как на картинке?
Добрый день!
Один сигнал - одна сделка.
Удачных торгов!
П.С. Рекомендую пересмотреть алгоритм закрытия ордеров, переменные sellticket и byuticket при перезагрузке терминала обнуляются.
Изменено 3 мая, 2017 пользователем SilverKZ
Спасибо за помощь!
Если я правильно понял, Вы просто условие для входя взяли не цену выше/ниже сигнала, а просто любое не нулевое значение буфера. Надо будет запомнить такой способ.
Кстати, почему-то не все сигналы берет (на скрине)...
А насчет этого Вашего пожелания: "П.С. Рекомендую пересмотреть алгоритм закрытия ордеров, переменные sellticket и byuticket при перезагрузке терминала обнуляются." - я пока еще не так хорошо знаю язык, чтобы решить эту задачу. Буду учиться дальше)
Всем привет) Хотел попросить реализовать идею для теста. Смысл прост - если цена колбасится в пределах ~20пп на тф H1 ~6-8 свечей, то она обязательно после этого идет какое-то количество пунктов в одну сторону. Т.е нужно extern'ы тэйка стопа свечей и предела флэта.
И опять я)
Добрый день.
Уже оперативка дымится: проблема возникла в советнике, после взятия TP или SL, опять открывает ордер!
Не могу придумать условие при котором советник привязывался только ко 2 му бару (после появления сигнала(цвета) от индикатора)
или же , если сработал TP или SL он бы ждал нового сигнала, но только при смене сигнала(цвета) индикатора.
Друзья, изучаю 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);
}
Изменено 4 мая, 2017 пользователем ivan100096
Ошибки есть и фактические и логические, вот некоторые:
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)
Здраствуйте!
Прошу прощения, но скорее всего этот вопрос уже обсуждался но я буду благодарен если ктонибудь всетаки поможет или кинет ссылку на материал.
Вопрос : как получить значение закрытия "прошлой" свечи.
Грубо говоря такая задача - как можно написать код для выставления стоп ордера выше например хая свечи при условии что ее 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);
Здраствуйте!
Прошу прощения, но скорее всего этот вопрос уже обсуждался но я буду благодарен если ктонибудь всетаки поможет или кинет ссылку на материал.
Вопрос : как получить значение закрытия "прошлой" свечи.
Грубо говоря такая задача - как можно написать код для выставления стоп ордера выше например хая свечи при условии что ее 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);Даже если реализовать вот такое условие:
"последняя закрытая позиция имеет тип, такой же, какой поступил сигнал, и если эта позиция была закрыта по одному из стоп-приказов, то не открывать позицию."
То остается баг в начале(когда только ставишь советник) ордер открывается не в начале тренда! :(( :(( :(( :(( :((
или же , если сработал TP или SL он бы ждал нового сигнала, но только при смене сигнала(цвета) индикатора.
d1w4m3, при каждом открытии ордера по какому-то сигналу индикатора, просто запоминайте тип этого сигнала в переменную. А при открытии каждого нового ордера прописывайте условие:
если текущий сигнал не равен тому, который хранится в переменной, то открывать ордер.
А чтобы не было вот этого:
То остается баг в начале(когда только ставишь советник) ордер открывается не в начале тренда!
Переменной, в которой будете хранить тип последнего сигнала, при объявлении присваивайте значение, которое не будет совпадать ни с одним из возможных сигналов от индикатора.
Решил для себя написать советника помощника.
Пытаюсь торговать по стратегии 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? при моих условиях стоп то ставится то удаляется на каждом тике.
Так может здесь кто подскажет
или же , если сработал 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 й день не соображу)
Или дайте хоть видео или литературу почитать на счет этого, а я ток начал этим увлекаться!
Изменено 4 мая, 2017 пользователем d1w4m3
день добрый программированию вообще не обучен :(
пожалуйста помогите
может найдётся кто добрый с прямыми руками а не как у меня :) и с пару часов свободного времени
взял тут на форуме индикатор !3 MarketProfile_VirginpPOC
и всё бы хорошо но у него есть две не критичные ошибки declaration of 'StartTime' hides global declaration at line 30
возможно по этому не корректно работает Max_of_days_calculation = 90; // Максимальное количество дней для расчета если -1 вся доступная история
ставлю хоть конкретное число, хоть -1 уровни которые не отработали рисует на данный момент только от 24-25 числа прошлого месяца
как видно из первого скрина указано 240 дней а показывает не более 20 дней
на втором скрине видно не отработанные уровни
хотелось бы что бы рисовал не отработанные уровни за указанное количество дней
ни каких удаление объектов в советниках не включено или разрешено более 240 дней
или я что то не правильно понимаю и в индикаторе так всё и должно быть ?
заранее спасибо откликнувшимся удачи вам и профита
Изменено 4 мая, 2017 пользователем terminal
при каждом открытии ордера по какому-то сигналу индикатора, просто запоминайте тип этого сигнала в переменную.
Вот в этом вся и проблема я не понимаю где конкретно,в коде это сделать! А потом сравнивать с типом ордера?
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();
}
}
}
мммм я точно что то недогоняю походу(((
Изменено 5 мая, 2017 пользователем d1w4m3
Вот в этом вся и проблема я не понимаю где конкретно,в коде это сделать! А потом сравнивать с типом ордера?
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;
}
}
}
Это очень упрощенный, схематичный вариант, демонстрирующий то, как можно фильтровать, чередовать сигналы и т.п.
Фухх))Спасибо! Где такому научиться не подскажете литературу?
Все разобрался окончательно!
Остался баг "Переменной, в которой будете хранить тип последнего сигнала, при объявлении присваивайте значение, которое не будет совпадать ни с одним из возможных сигналов от индикатора"
у нас -1 и все равно он в начале открывает?
Или есть какая-нибудь возможность привязаться к буферам индикатора, тобишь пока не поступит новый сигнал о смене буфера - не открывать.
Добавлено: 05-05-2017 11:26:39
Изменено 5 мая, 2017 пользователем d1w4m3
TradeSignal() мне нужно написать ее, получается?или это как пример для сигналов?
Функцию я просто так, для примера придумал. У Вас это может быть функция, или просто текущий сигнал индикатора (например iCustom()). Просто на пальцах попытался объяснить.
Фухх))Спасибо! Где такому научиться не подскажете литературу?
Обычная документация по MQL4. :)
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
Радует одно что я на правильном пути))Ток знаний не хватает пока.
Изменено 5 мая, 2017 пользователем d1w4m3
Остался баг "Переменной, в которой будете хранить тип последнего сигнала, при объявлении присваивайте значение, которое не будет совпадать ни с одним из возможных сигналов от индикатора"
у нас -1 и все равно он в начале открывает?
Или есть какая-нибудь возможность привязаться к буферам индикатора, тобишь пока не поступит новый сигнал о смене буфера - не открывать.
Ну правильно, мы специально присваивали -1, чтобы советник открывался на первом же сигнале, независимо от того какой сигнал с индикатора поступит первым. Если нужно ,чтобы первый сигнал пропускался , то присвойте ей (переменной) значение текущего сигнала индикатора в функции OnInit(). Таким образом на этапе инициализации Вы исключите открытие по текущему сигналу при первом запуске советника.
Ну правильно, мы специально присваивали -1, чтобы советник открывался на первом же сигнале, независимо от того какой сигнал с индикатора поступит первым. Если нужно ,чтобы первый сигнал пропускался , то присвойте ей (переменной) значение текущего сигнала индикатора в функции OnInit(). Таким образом на этапе инициализации Вы исключите открытие по текущему сигналу при первом запуске советника.
А как я узнаю текущий сигнал от индикатора?Когда я включаю советник то он может быть или бай или сел?
А как я узнаю текущий сигнал от индикатора?Когда я включаю советник то он может быть или бай или сел?
Я так понял, у Вас сигналы приходят из этих функций DN_Trend() и UP_Trend()? Если так, то напишите в OnInit() примерно следующее:
if(DN_Trend()==true) LastTradeSignal=OP_SELL;
if(UP_Trend()==true) LastTradeSignal=OP_BUY;
Спасибо огромное, это я уже чудить начал))забыл проверить
фуууух
Изменено 5 мая, 2017 пользователем d1w4m3
int OnInit()
{ LastTradeSignal=0;
LastTradeSignal=1;
/////////,,
только так заработало, только для села
В общем Вам нужно перечитать все что я писал выше. Вдумчиво перечитать. Я ответил максимально развернуто, как только возможно. Если хотите выйти на нормальный уровень программирования, то не спешите. Не хватайтесь сразу за непосильные вещи, идите от простого к сложному. Если чего то не понимаете, то делайте шаг назад и заново повторяйте. Вы должны научиться четко понимать что, где и почему пишется в коде. Должны самостоятельно научиться делать логические конструкции.
Ну вот что Вы написали здесь? Сначала присваиваете LastTradeSignal=0, а потом тут-же переопределяете значение LastTradeSignal=1. В чем смысл? Я же написал как надо. Где условия, при которых LastTradeSignal принимает то или иное значение?
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем