double OOP,SL;
int b=0,s=0,tip,TicketB=0,TicketS=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
tip = OrderType();
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
if(tip==OP_BUY)
{
b++;
TicketB=OrderTicket();
if(Stoploss!=0 && Bid<=OOP - Stoploss * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,clrNONE)) continue;}
if(Takeprofit!=0 && Bid>=OOP + Takeprofit * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,clrNONE)) continue;}
if(TrailingStop>0)
{
SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
if(SL>=OOP+TrailingStart*Point && (TrallB==0 || TrallB+TrailingStep*Point<SL)) TrallB=SL;
}
}
if(tip==OP_SELL)
{
s++;
if(Stoploss!=0 && Ask>=OOP + Stoploss * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrNONE)) continue;}
if(Takeprofit!=0 && Ask<=OOP - Takeprofit * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrNONE)) continue;}
TicketS=OrderTicket();
if(TrailingStop>0)
{
SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
if(SL<=OOP-TrailingStart*Point && (TrallS==0 || TrallS-TrailingStep*Point>SL)) TrallS=SL;
}
}
}
}
}
#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//----------Переменные-----------------------------------------------
input double Lot = 0.01; //Размер лота
input int Slippage = 150; //Величина проскальзвания
input int Magic = 1; //Мэджик
input int TakeProfit = 300; //Тейк-профит в пунктах
input int StopLoss = 300; //Стоп-лосс в пунктах
input int MA1 = 3; //Период первого мувинга
input int MA2 = 20; //Период второго мувинга
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double tp=NormalizeDouble(TakeProfit*_Point,_Digits); //Нормализация значения тейк-профита
double sl=NormalizeDouble(StopLoss*_Point,_Digits); //Нормализация значения стоп-лосса
//+------------------------------------------------------------------+
//| Подсчет открытых ордеров |
//+------------------------------------------------------------------+
int sellorders = 0;
int buyorders = 0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
if(OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
buyorders++;
if(OrderType()==OP_SELL)
sellorders++;
}
}
//+------------------------------------------------------------------+
//| Условия для открытия позиции |
//+------------------------------------------------------------------+
double ma1=iMA(_Symbol,0,MA1,0,MODE_EMA,PRICE_CLOSE,1);
double ma2=iMA(_Symbol,0,MA2,0,MODE_EMA,PRICE_CLOSE,1);
if(buyorders==0 && ma1>ma2)
{
int tik=OrderSend(_Symbol,OP_BUY,Lot,Ask,Slippage,0,0,"",Magic,0,clrGreen);
if(tik>0)
Print("Ордер BUY открыт");
else
Print("Ордер BUY отклонен");
}
if(sellorders==0 && ma1<ma2)
{
int tik=OrderSend(_Symbol,OP_SELL,Lot,Bid,Slippage,0,0,"",Magic,0,clrRed);
if(tik>0)
Print("Ордер SELL открыт");
else
Print("Ордер SELL отклонен");
}
//+------------------------------------------------------------------+
//| Модификация ордеров. Установка тейк-профита и стоп-лосса |
//+------------------------------------------------------------------+
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
if(OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
if(OrderStopLoss()==0 && OrderTakeProfit()==0)
if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl,_Digits),NormalizeDouble(OrderOpenPrice()+tp,_Digits),0,clrBlue)==true)
Print("Modify is OK!");
else
Print("Modify is not OK!");
if(OrderType()==OP_SELL)
if(OrderStopLoss()==0 && OrderTakeProfit()==0)
if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl,_Digits),NormalizeDouble(OrderOpenPrice()-tp,_Digits),0,clrOrange)==true)
Print("Modify is OK!");
else
Print("Modify is not OK!");
}
}
//+------------------------------------------------------------------+
//| Условия для закрытия ордеров по обратному сигналу |
//+------------------------------------------------------------------+
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
if(OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
if(buyorders>0 && ma1<ma2)
if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slippage,clrAqua)==true)
Print("Ордер BUY закрыт");
else
Print("Ордер BUY не закрыт");
if(OrderType()==OP_SELL)
if(sellorders>0 && ma1>ma2)
if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slippage,clrAqua)==true)
Print("Ордер SELL закрыт");
else
Print("Ордер SELL не закрыт");
}
}
}
ma1>ma2 Это не пересечение МА. Это буквально одна МА больше другой. Значит пересечение было, но когда неизвестно.Всем привет.
Всех с наступившим Новым Годом!
Я начал изучать язык mql4, выполняя простейшие задачи. Поскольку у меня нет профильной базы и я самоучка, для обучения использую все доступные материалы: различные текстовые типа справочника, форумы ну и конечно видео в ютюбе.
Написал простенький советник, который работает на двух мувингах. И вроде бы все хорошо и написанные условия выполняются, однако не совсем так как хотелось.
Условия для открытия сделки: пересечение MA1 и MA2. Условия для закрытия: обратное пересечение, тейк-профит или стоп-лосс.
Помогите, пожалуйста, решить следующие вопросы:
1. Когда начинаю тестирование, советник сразу же открывает сделку в сторону пересечения, хотя пересечение было давно несколько баров назад. Как сделать так, чтобы сделка открывалась только на следующем баре после пересечения?
2. После достижения тейк-профита или стоп-лосса советник продолжает открывать сделки в сторону пересечения. Как его остановить? Если был достигнут стоп или тейк, то сделка должна будет открыться только после обратного сигнала? То есть, если позиция бай закрылась по ТП или СЛ, то следующий бай будет только после отработки позиции селл?
3. У меня получается одновременно открыть два ордера, но не получается прописать для них разные условия закрытия. Например, открывается два ордера одновременно, но один должен закрыться при достижении ТП или СЛ, а второй при обратном сигнале или достижении СЛ. Как прописать разные условия для двух одновременно открытых ордеров?
Заранее всем спасибо за помощь!
Код:#property copyright "Copyright 2023, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //----------Переменные----------------------------------------------- input double Lot = 0.01; //Размер лота input int Slippage = 150; //Величина проскальзвания input int Magic = 1; //Мэджик input int TakeProfit = 300; //Тейк-профит в пунктах input int StopLoss = 300; //Стоп-лосс в пунктах input int MA1 = 3; //Период первого мувинга input int MA2 = 20; //Период второго мувинга //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { double tp=NormalizeDouble(TakeProfit*_Point,_Digits); //Нормализация значения тейк-профита double sl=NormalizeDouble(StopLoss*_Point,_Digits); //Нормализация значения стоп-лосса //+------------------------------------------------------------------+ //| Подсчет открытых ордеров | //+------------------------------------------------------------------+ int sellorders = 0; int buyorders = 0; for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS)==true) if(OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) buyorders++; if(OrderType()==OP_SELL) sellorders++; } } //+------------------------------------------------------------------+ //| Условия для открытия позиции | //+------------------------------------------------------------------+ double ma1=iMA(_Symbol,0,MA1,0,MODE_EMA,PRICE_CLOSE,1); double ma2=iMA(_Symbol,0,MA2,0,MODE_EMA,PRICE_CLOSE,1); if(buyorders==0 && ma1>ma2) { int tik=OrderSend(_Symbol,OP_BUY,Lot,Ask,Slippage,0,0,"",Magic,0,clrGreen); if(tik>0) Print("Ордер BUY открыт"); else Print("Ордер BUY отклонен"); } if(sellorders==0 && ma1<ma2) { int tik=OrderSend(_Symbol,OP_SELL,Lot,Bid,Slippage,0,0,"",Magic,0,clrRed); if(tik>0) Print("Ордер SELL открыт"); else Print("Ордер SELL отклонен"); } //+------------------------------------------------------------------+ //| Модификация ордеров. Установка тейк-профита и стоп-лосса | //+------------------------------------------------------------------+ for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS)==true) if(OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) if(OrderStopLoss()==0 && OrderTakeProfit()==0) if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl,_Digits),NormalizeDouble(OrderOpenPrice()+tp,_Digits),0,clrBlue)==true) Print("Modify is OK!"); else Print("Modify is not OK!"); if(OrderType()==OP_SELL) if(OrderStopLoss()==0 && OrderTakeProfit()==0) if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl,_Digits),NormalizeDouble(OrderOpenPrice()-tp,_Digits),0,clrOrange)==true) Print("Modify is OK!"); else Print("Modify is not OK!"); } } //+------------------------------------------------------------------+ //| Условия для закрытия ордеров по обратному сигналу | //+------------------------------------------------------------------+ for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS)==true) if(OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) if(buyorders>0 && ma1<ma2) if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slippage,clrAqua)==true) Print("Ордер BUY закрыт"); else Print("Ордер BUY не закрыт"); if(OrderType()==OP_SELL) if(sellorders>0 && ma1>ma2) if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slippage,clrAqua)==true) Print("Ордер SELL закрыт"); else Print("Ордер SELL не закрыт"); } } }
ma1>ma2 Это не пересечение МА. Это буквально одна МА больше другой. Значит пересечение было, но когда неизвестно.
Пересечение это одна МА больше другой, но в прошлом их расположение было обратным.
В прошлом может быть на предыдущем тике или на предыдущем баре.
Например:
if(ma1>ma2 && ma12<ma22)
ma1, ma2 - МА на 1 баре
ma12, ma22 - эти же МА, но на 2 баре
Что бы советник по разному сопровождал открытые ордера, нужно что бы он их отличал.Всем привет.
Всех с наступившим Новым Годом!
Я начал изучать язык mql4, выполняя простейшие задачи. Поскольку у меня нет профильной базы и я самоучка, для обучения использую все доступные материалы: различные текстовые типа справочника, форумы ну и конечно видео в ютюбе.
Написал простенький советник, который работает на двух мувингах. И вроде бы все хорошо и написанные условия выполняются, однако не совсем так как хотелось.
Условия для открытия сделки: пересечение MA1 и MA2. Условия для закрытия: обратное пересечение, тейк-профит или стоп-лосс.
Помогите, пожалуйста, решить следующие вопросы:
1. Когда начинаю тестирование, советник сразу же открывает сделку в сторону пересечения, хотя пересечение было давно несколько баров назад. Как сделать так, чтобы сделка открывалась только на следующем баре после пересечения?
2. После достижения тейк-профита или стоп-лосса советник продолжает открывать сделки в сторону пересечения. Как его остановить? Если был достигнут стоп или тейк, то сделка должна будет открыться только после обратного сигнала? То есть, если позиция бай закрылась по ТП или СЛ, то следующий бай будет только после отработки позиции селл?
3. У меня получается одновременно открыть два ордера, но не получается прописать для них разные условия закрытия. Например, открывается два ордера одновременно, но один должен закрыться при достижении ТП или СЛ, а второй при обратном сигнале или достижении СЛ. Как прописать разные условия для двух одновременно открытых ордеров?
Заранее всем спасибо за помощь!
Код:#property copyright "Copyright 2023, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //----------Переменные----------------------------------------------- input double Lot = 0.01; //Размер лота input int Slippage = 150; //Величина проскальзвания input int Magic = 1; //Мэджик input int TakeProfit = 300; //Тейк-профит в пунктах input int StopLoss = 300; //Стоп-лосс в пунктах input int MA1 = 3; //Период первого мувинга input int MA2 = 20; //Период второго мувинга //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { double tp=NormalizeDouble(TakeProfit*_Point,_Digits); //Нормализация значения тейк-профита double sl=NormalizeDouble(StopLoss*_Point,_Digits); //Нормализация значения стоп-лосса //+------------------------------------------------------------------+ //| Подсчет открытых ордеров | //+------------------------------------------------------------------+ int sellorders = 0; int buyorders = 0; for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS)==true) if(OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) buyorders++; if(OrderType()==OP_SELL) sellorders++; } } //+------------------------------------------------------------------+ //| Условия для открытия позиции | //+------------------------------------------------------------------+ double ma1=iMA(_Symbol,0,MA1,0,MODE_EMA,PRICE_CLOSE,1); double ma2=iMA(_Symbol,0,MA2,0,MODE_EMA,PRICE_CLOSE,1); if(buyorders==0 && ma1>ma2) { int tik=OrderSend(_Symbol,OP_BUY,Lot,Ask,Slippage,0,0,"",Magic,0,clrGreen); if(tik>0) Print("Ордер BUY открыт"); else Print("Ордер BUY отклонен"); } if(sellorders==0 && ma1<ma2) { int tik=OrderSend(_Symbol,OP_SELL,Lot,Bid,Slippage,0,0,"",Magic,0,clrRed); if(tik>0) Print("Ордер SELL открыт"); else Print("Ордер SELL отклонен"); } //+------------------------------------------------------------------+ //| Модификация ордеров. Установка тейк-профита и стоп-лосса | //+------------------------------------------------------------------+ for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS)==true) if(OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) if(OrderStopLoss()==0 && OrderTakeProfit()==0) if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl,_Digits),NormalizeDouble(OrderOpenPrice()+tp,_Digits),0,clrBlue)==true) Print("Modify is OK!"); else Print("Modify is not OK!"); if(OrderType()==OP_SELL) if(OrderStopLoss()==0 && OrderTakeProfit()==0) if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl,_Digits),NormalizeDouble(OrderOpenPrice()-tp,_Digits),0,clrOrange)==true) Print("Modify is OK!"); else Print("Modify is not OK!"); } } //+------------------------------------------------------------------+ //| Условия для закрытия ордеров по обратному сигналу | //+------------------------------------------------------------------+ for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS)==true) if(OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) if(buyorders>0 && ma1<ma2) if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slippage,clrAqua)==true) Print("Ордер BUY закрыт"); else Print("Ордер BUY не закрыт"); if(OrderType()==OP_SELL) if(sellorders>0 && ma1>ma2) if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slippage,clrAqua)==true) Print("Ордер SELL закрыт"); else Print("Ордер SELL не закрыт"); } } }
Спасибо ОГРОМНОЕ! Здесь все получилось!ma1>ma2 Это не пересечение МА. Это буквально одна МА больше другой. Значит пересечение было, но когда неизвестно.
Пересечение это одна МА больше другой, но в прошлом их расположение было обратным.
В прошлом может быть на предыдущем тике или на предыдущем баре.
Например:
if(ma1>ma2 && ma12<ma22)
ma1, ma2 - МА на 1 баре
ma12, ma22 - эти же МА, но на 2 баре
Спасибо ОГРОМНОЕ! А здесь логика мне теперь понятна.Что бы советник по разному сопровождал открытые ордера, нужно что бы он их отличал.
Самый универсальный, но не самый простой, способ это использовать разные маджики.
Это он не ругается, а предупреждает, что в строке, где переменная clr инициализируется, не задается ее первоначальное значение. Нужно что-то типа color clr=clrWhite;Добрый день. подскажите. мозг весь сломал. почему ругается именно на нее а дальше везде норм.
Посмотреть вложение 495389
Значит есть разница. Просто сделайте как сказал и предупреждение исчезнет. По хорошему, все переменные должны иметь изначальное значение. При компиляции в режиме стрикт на это обращается внимание.Идентичный кусок кода, все в порядке
Посмотреть вложение 495394
на старте так как и везде
Посмотреть вложение 495395
Только примерно, за несколько секунд до закрытия. Окончательная цена закрытия свечи будет известна только при открытии новой.Нужна небольшая помощь. Знаем буфер индикатора. "BUF" , как получить от него данные один раз в день на закрытии последней свечи.
Цель какая. При получении данных построить горизонтальную линия до следующего дня.
если не трудно помогите.
понятно. уточню . запускаем индикатор в обед . а он должен найти открытие этого дня или закрытие прошлого дня и на этой свече взять данные от стороннего индикатора или произвести расчет и построить уровень на этот день. как то так.Только примерно, за несколько секунд до закрытия. Окончательная цена закрытия свечи будет известна только при открытии новой.
if(Hour()==23 && Minute()==59 && Seconds()==59)
{
Ind=iCustom(...);
}
Естественно, это должно работать в таймере OnTime(). Так как в строго заданную секунду тиков может и не быть, события OnTick() может не быть.
Узнать время открытия дневного бара сегодня. Найти бар нужного таймфрема соответствующего этому времени. Это первый бар текущего дня. +1 - последний бар прошлого дня.понятно. уточню . запускаем индикатор в обед . а он должен найти открытие этого дня или закрытие прошлого дня и на этой свече взять данные от стороннего индикатора или произвести расчет и построить уровень на этот день. как то так.Посмотреть вложение 496578
Спасибо, попробую реализовать.Узнать время открытия дневного бара сегодня. Найти бар нужного таймфрема соответствующего этому времени. Это первый бар текущего дня. +1 - последний бар прошлого дня.
Последний бар прошлого дня текущего таймфрейма.
int LastBar=iBarShift(NULL,0,iTime(NULL,1440,0))+1;
double Ind=iCustom(... ,LastBar);
к первой точке прибавь PERIOD_D1*60 (для МТ4)как продлить линия до конца дня ?
Спасибок первой точке прибавь PERIOD_D1*60 (для МТ4)