Что бы код был читаемым, перед тем как его опубликовать, нужно нажать кнопочку(вверху) SRC
Line_Sell=NormalizeDouble(ObjectGetValueByShift("TL_Sell",0),5); Line_Buy=NormalizeDouble(ObjectGetValueByShift("TL_Buy",0),5); Comment( "Line_Buy: " + DoubleToStr( Line_Buy,5) + " , Line_Sel: " + DoubleToStr( Line_Sell,5) ); //поверить есть ли открытые ордера Buy. если нет открываем ордер когда цена будет выше линии Buy if(CountBuy()==0 && Line_Buy<Ask) ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,0,0,"",Magic,0,Blue); //поверить есть ли открытые ордера Buy. если есть закрываем ордер когда цена будет ниже линии Sell if(CountBuy()==1&& Line_Sell>Bid ) { for(int i=OrdersTotal()-1; i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderMagicNumber()==Magic && OrderType()==OP_BUY) bool a=OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Black); } } } // открытие и закрытие ордеров происходит не по тем условиям что я хотел if(CountBuy()==0 && Line_Buy<Ask)
Line_Sell=NormalizeDouble(ObjectGetValueByShift("TL_Sell",0),5); Line_Buy=NormalizeDouble(ObjectGetValueByShift("TL_Buy",0),5); Comment( "Line_Buy: " + DoubleToStr( Line_Buy,5) + " , Line_Sel: " + DoubleToStr( Line_Sell,5) ); //поверить есть ли открытые ордера Buy. если нет открываем ордер когда цена будет выше линии Buy if(CountBuy()==0 && Line_Buy<Ask) ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,0,0,"",Magic,0,Blue); //поверить есть ли открытые ордера Buy. если есть закрываем ордер когда цена будет ниже линии Sell if(CountBuy()==1&& Line_Sell>Bid ) { for(int i=OrdersTotal()-1; i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderMagicNumber()==Magic && OrderType()==OP_BUY) bool a=OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Black); } } }
// открытие и закрытие ордеров происходит не по тем условиям что я хотел if(CountBuy()==0 && Line_Buy<Ask)
линия Line_Buy и Line_Sell отображается, параметры через comment на 0 bar показаны правельно не могу понять почему открытие и закрытие происходит не правельно подскажите что надо сделать
// открытие и закрытие ордеров происходит не по тем условиям что я хотел if(CountBuy()==0 && Line_Buy<Ask)
линия Line_Buy и Line_Sell отображается, параметры через comment на 0 bar показаны правельно не могу понять почему открытие и закрытие происходит не правельно подскажите что надо сделать
int CountBuy() { int count=0; for(int i= OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) count++; } } } return(count); } //+------------------------------------------------------------------+функция для проверки ордеров у меня работает нормально у меня не срабатывает второе условие для открытия и закрытие ордера цена должна пересекать трендовую линию
функция для проверки ордеров у меня работает нормально у меня не срабатывает второе условие для открытия и закрытие ордера цена должна пересекать трендовую линию
Line_Sell и Line_Buy принимают осмысленные значения?
Line_Sell и Line_Buy принимают осмысленные значения?
Да значения осмысленные в Commente на мониторе значение этих линий на 0 баре соотвествуют с графиком а ордера открываются и закрываются не в момент пересечения, перепроверил все вроде правельно, в визуальном режиме заметил что сбой происходит во время перерисовки линий
выкладываю код полностью
//| фрактал.mq4 | //| Copyright 2014, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2014, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property strict input color Resistance_Color=Red; input ENUM_LINE_STYLE Resistance_Style; input int Resistance_Width=1; input color Support_Color=Red; input ENUM_LINE_STYLE Support_Style; input int Support_Width=1; extern double Lots = 0.1; extern int TakeProfit = 50; extern int StopLoss = 50; extern int ProfitSeriya = 5; extern int Profit = 5; //extern int Step = 50; extern int filtr =4; extern int slippage = 5; double TP,price,lastlot,Pr,SL; int ticket,Magic=123; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ObjectDelete(0,"TL_Resistance"); //удаляем линию сопротевления на текущем графике ObjectDelete(0,"TL_Support"); //удаляем линию поддержки на текущем графике ObjectDelete(0,"TL_Buy"); //удаляем линию поддержки на текущем графике ObjectDelete(0,"TL_Sell"); //удаляем линию поддержки на текущем графике } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //---объявление переменных int n,UpperFractal_1=0,UpperFractal_2=0,LowerFractal_1=0,LowerFractal_2=0; double UpperPrice_1=0,UpperPrice_2=0,LowerPrice_1=0,LowerPrice_2=0,low_1,high_1 ,Line_Buy=0,Line_Sell=0; low_1=iLow(Symbol(),PERIOD_CURRENT,1); high_1=iHigh(Symbol(),PERIOD_CURRENT,1); //--- находим индекс бара первого ближайшего верхнего фрактала for(n=0; n<(Bars-1);n++) { if(iFractals(Symbol(),PERIOD_CURRENT,MODE_UPPER,n)!=NULL) break; UpperFractal_1=n+1; UpperPrice_1=iHigh(Symbol(),PERIOD_CURRENT,UpperFractal_1); } //--- находим индекс бара второго ближайшего верхнего фрактала for(n=UpperFractal_1+1; n<(Bars-1);n++) { if(iFractals(Symbol(),PERIOD_CURRENT,MODE_UPPER,n)!=NULL) break; UpperFractal_2=n+1; UpperPrice_2=iHigh(Symbol(),PERIOD_CURRENT,UpperFractal_2); } //--- находим индекс бара первого ближайшего нижнего фрактала for(n=0; n<(Bars-1);n++) { if(iFractals(Symbol(),PERIOD_CURRENT,MODE_LOWER,n)!=NULL) break; LowerFractal_1=n+1; LowerPrice_1=iLow(Symbol(),PERIOD_CURRENT,LowerFractal_1); } //--- находим индекс бара второго ближайшего нижнего фрактала for(n=LowerFractal_1+1; n<(Bars-1);n++) { if(iFractals(Symbol(),PERIOD_CURRENT,MODE_LOWER,n)!=NULL) break; LowerFractal_2=n+1; LowerPrice_2=iLow(Symbol(),PERIOD_CURRENT,LowerFractal_2); } //-- Этап 1. Определение временного значения экстремума на таймфрейме: //--- определение времени фракталов datetime UpFractalTime_1=iTime(Symbol(),PERIOD_CURRENT,UpperFractal_1); datetime UpFractalTime_2=iTime(Symbol(),PERIOD_CURRENT,UpperFractal_2); datetime LowFractalTime_1=iTime(Symbol(),PERIOD_CURRENT,LowerFractal_1); datetime LowFractalTime_2=iTime(Symbol(),PERIOD_CURRENT,LowerFractal_2); datetime time=iTime(Symbol(),PERIOD_CURRENT,0); datetime time_1=iTime(Symbol(),PERIOD_CURRENT,1); datetime time_2=iTime(Symbol(),PERIOD_CURRENT,2); //--- создание линии поддержки // ObjectCreate(0,"TL_Support",OBJ_TREND,0,LowFractalTime_2,LowerPrice_2, // LowFractalTime_1,LowerPrice_1); ObjectCreate(0,"TL_Buy",OBJ_TREND,0,LowFractalTime_2,LowerPrice_2, time_1,high_1); //--- цвета линии поддержки ObjectSet("TL_Buy",OBJPROP_COLOR,clrYellow); ObjectSet("TL_Support",OBJPROP_COLOR,Support_Color); // ObjectSet("TL_Support",OBJPROP_STYLE,Support_Style); // ObjectSet("TL_Support",OBJPROP_WIDTH,Support_Width); //--- создание линии сопротивления // ObjectCreate(0,"TL_Resistance",OBJ_TREND,0,UpFractalTime_2,UpperPrice_2, // UpFractalTime_1,UpperPrice_1); ObjectCreate(0,"TL_Sell",OBJ_TREND,0,UpFractalTime_2,UpperPrice_2, time_1,low_1); //--- цвета линии сопротивления ObjectSet("TL_Sell",OBJPROP_COLOR,clrYellow); ObjectSet("TL_Resistance",OBJPROP_COLOR,Resistance_Color); // ObjectSet("TL_Resistance",OBJPROP_STYLE,Resistance_Style); // ObjectSet("TL_Resistance",OBJPROP_WIDTH,Resistance_Width); //--- перерисовка линии поддержки //--- записываем значения временных координат линии поддержки в переменные // string TL_Suppor=(string)TL_Support; datetime TL_TimeLow2=(datetime)ObjectGet("TL_Support",OBJPROP_TIME2);// устанавливаем вторую координату времени линии поддержки datetime TL_TimeLow1=(datetime)ObjectGet("TL_Support",OBJPROP_TIME1); // устанавливаем первую координату времени линии поддержки datetime TL_Time1=(datetime)ObjectGet("TL_Buy",OBJPROP_TIME1); // устанавливаем первую координату времени линии Buy datetime TL_Time2=(datetime)ObjectGet("TL_Buy",OBJPROP_TIME2); // устанавливаем вторую координату времени линии Buy //---если координаты линии не совпадают с текущими if(TL_TimeLow2!=LowFractalTime_1 && TL_TimeLow1!=LowFractalTime_2) /*вторая координата времени линии поддержки не равно второму времени N-точки привязки и первая координату времени линии поддержки не равно первому времени N-точки привязки*/ { //---удаляем линию ObjectDelete(0,"TL_Support"); } if( TL_Time2!=time_1 ) /*вторую координату времени линии поддержки не равно второму времени N-точки привязки*/ { //---удаляем линию ObjectDelete(0,"TL_Buy"); } //--- перерисовка линии сопротивления //--- записываем значения временных координат линии сопротивления в переменные datetime TL_TimeUp2=(datetime)ObjectGet("TL_Resistance",OBJPROP_TIME2); datetime TL_TimeUp1=(datetime)ObjectGet("TL_Resistance",OBJPROP_TIME1); datetime TL_TimeS1=(datetime)ObjectGet("TL_Sell",OBJPROP_TIME1); datetime TL_TimeS2=(datetime)ObjectGet("TL_Sell",OBJPROP_TIME2); //--- если координаты линии не совпадают с текущими if(TL_TimeUp2!=UpFractalTime_1 && TL_TimeUp1!=UpFractalTime_2) { //--- удаляем линию ObjectDelete(0,"TL_Resistance"); } if(TL_TimeS2!=time_1 ) { //--- удаляем линию ObjectDelete(0,"TL_Sell"); } //--- контроль загруженности баров в истории if(UpperFractal_1==-1 || UpperFractal_2==-1 || LowerFractal_1==-1 || LowerFractal_2==-1) { Alert("Для корректной работы недостаточно загружена история!"); } Line_Sell=ObjectGetValueByShift("TL_Sell",0); Line_Buy=ObjectGetValueByShift("TL_Buy",0); Comment( "Line_Buy: " + DoubleToStr( Line_Buy,5) + " , Line_Sel: " + DoubleToStr( Line_Sell,5) ); //поверить есть ли открытые ордера Buy. если нет открываем ордер когда цена будет выше линии Buy if(CountBuy()==0 && Line_Buy<Ask ) ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,0,0,"",Magic,0,Blue); //поверить есть ли открытые ордера Buy. если есть закрываем ордер когда цена будет ниже линии Sell if(CountBuy()==1 && Line_Sell>Bid ) { for(int i=OrdersTotal()-1; i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderMagicNumber()==Magic && OrderType()==OP_BUY) bool a=OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Black); } } } if(CountSell()==0&& Line_Sell>Bid ) ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,slippage,0,0,"",Magic,0,Red); if(CountSell()==1&& Line_Buy<Ask) { for(int i=OrdersTotal()-1; i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderMagicNumber()==Magic && OrderType()==OP_SELL) bool x=OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Black); } } } } //+------------------------------------------------------------------+ int CountBuy() { int count=0; for(int i= OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) count++; } } } return(count); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ int CountSell() { int count=0; for(int i= OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_SELL) count++; } } } return(count); } //+------------------------------------------------------------------+
рисуем трендовую линию от верхнего фракала через минимум последнего закрытого бара линию селл
на нулевом баре отслеживаем цену если цена пересекла опустилась ниже линии селл открываем ордер селл а ордер бай закрываем
аналогично и линией бай если цена пересекла поднялась выше линии бай открываем ордер бай а ордер селл закрываем
вот и все без всяких дополнительных условий
рисуем трендовую линию от верхнего фракала через минимум последнего закрытого бара линию селл
на нулевом баре отслеживаем цену если цена пересекла опустилась ниже линии селл открываем ордер селл а ордер бай закрываем
аналогично и линией бай если цена пересекла поднялась выше линии бай открываем ордер бай а ордер селл закрываем
вот и все без всяких дополнительных условий
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Line_Sell=NormalizeDouble(ObjectGetValueByShift("TL_Sell",0),5);
Line_Buy=NormalizeDouble(ObjectGetValueByShift("TL_Buy",0),5);
Comment( "Line_Buy: " + DoubleToStr( Line_Buy,5) + " , Line_Sel: " + DoubleToStr( Line_Sell,5) );
//поверить есть ли открытые ордера Buy. если нет открываем ордер когда цена будет выше линии Buy
if(CountBuy()==0 && Line_Buy<Ask)
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,0,0,"",Magic,0,Blue);
//поверить есть ли открытые ордера Buy. если есть закрываем ордер когда цена будет ниже линии Sell
if(CountBuy()==1&& Line_Sell>Bid )
{
for(int i=OrdersTotal()-1; i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if(OrderMagicNumber()==Magic && OrderType()==OP_BUY)
bool a=OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Black);
}
}
}
// открытие и закрытие ордеров происходит не по тем условиям что я хотел if(CountBuy()==0 && Line_Buy<Ask)
линия Line_Buy и Line_Sell отображается, параметры через comment на 0 bar показаны правельно не могу понять почему открытие и закрытие происходит не правельно подскажите что надо сделать