//+------------------------------------------------------------------+ //| Fibo Open Day Safe.mq4 | //| Copyright © 2009, Стеценко Дмитрий Дмитриевич | //| http:// | //+------------------------------------------------------------------+ #property copyright "Copyright © 2009, Стеценко Дмитрий Дмитриевич" #property link "http://" extern double Lots = 0.01; // Внешняя переменная extern int MagicNumber = 777; bool IsNewDay = false; //////// ------------ ///////// int SystemState = 0; // // 0 - Idle // 1 - OpenOrder // 2 - SafeProfit // 3 - StopLoss double FB1, FB2, FB3, FS1, FS2, FS3;// Уровни фибоначчи int CurrentDay=0; // Дата текущего дня double openPrice; // цена открытия дня int CurrentOrderId=0; // Тикет открытого ордера int OrdFin[3]; int delta; extern bool OpenFB1=true; extern bool OpenFB2=true; extern bool OpenFS1=true; extern bool OpenFS2=true; extern int EMA1Mode=0; extern int EMA2Mode=0; extern int EMA1Type=0; extern int EMA2Type=0; extern int border=3; extern bool ReopenOrders=true; bool expirationForOrders=false; //истечение для ордеров extern int FB1SafeLoss = 10; int FB1SafeProfitTrailLevel = 10, FB1SafeProfit = 1;// SafeLoss - начальный СтопЛосс для ордера, extern int FB2SafeLoss = 10; int FB2SafeProfitTrailLevel = 10, FB2SafeProfit = 1;// SafeProfitTrailLevel - уровнь при котором ордер трейлится extern int FS1SafeLoss = 10; int FS1SafeProfitTrailLevel = 10, FS1SafeProfit = 1;// SafeProfit - количество пунктов минимального выигрыша вместо лося extern int FS2SafeLoss = 10; int FS2SafeProfitTrailLevel = 10, FS2SafeProfit = 1; extern int StopMA = 5; int FB1id, FB2id, FS1id, FS2id; extern int SlowMA = 2; extern int FastMA = 10; //////// ------------ ///////// datetime expDate; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- CurrentDay=TimeDay(TimeCurrent())-1; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int InitializeFiboLevels() { SystemState = 0;//режим ожидания openPrice = Ask-Point; FB1 = openPrice + 34*Point; FB2 = openPrice + 89*Point; FB3 = openPrice + 144*Point; FS1 = openPrice - 34*Point; FS2 = openPrice - 89*Point; FS3 = openPrice - 144*Point; OrdFin[0]=0; OrdFin[1]=0; OrdFin[2]=0; OrdFin[3]=0; expDate = TimeCurrent() + 86000; return(0); } int SetStopOrders() { if(expirationForOrders==false)expDate=0; if(OpenFB1==true)FB1id = OrderSend(Symbol(), OP_BUYSTOP, Lots, FB1, 0.01, FB1-FB1SafeLoss*Point, FB2, "FB1", MagicNumber, expDate, MediumBlue); if(OpenFS1==true)FS1id = OrderSend(Symbol(), OP_SELLSTOP, Lots, FS1, 0.01, FS1+FS1SafeLoss*Point, FS2, "FS1", MagicNumber, expDate, IndianRed); if(OpenFB2==true)FB2id = OrderSend(Symbol(), OP_BUYSTOP, Lots, FB2, 0.01, FB2-FB2SafeLoss*Point, FB3, "FB2", MagicNumber, expDate, MediumBlue); if(OpenFS2==true)FS2id = OrderSend(Symbol(), OP_SELLSTOP, Lots, FS2, 0.01, FS2+FS2SafeLoss*Point, FS3, "FS2", MagicNumber, expDate, IndianRed); return(0); } int CheckOpenOrder() { //Если отложеный стал на продажу или на покупку if(OpenFB1==true) { OrderSelect(FB1id, SELECT_BY_TICKET); if((OrderType()==OP_BUY) && (OrderCloseTime()==0))return(FB1id); } if(OpenFB2==true) { OrderSelect(FB2id, SELECT_BY_TICKET); if((OrderType()==OP_BUY) && (OrderCloseTime()==0))return(FB2id); } if(OpenFS1==true) { OrderSelect(FS1id, SELECT_BY_TICKET); if((OrderType()==OP_SELL) && (OrderCloseTime()==0))return(FS1id); } if(OpenFS2==true) { OrderSelect(FS2id, SELECT_BY_TICKET); if((OrderType()==OP_SELL) && (OrderCloseTime()==0))return(FS2id); } return(0); } int DeleteOrders() { bool isCloseSuccess=true; bool isSelectSuccess=true; isSelectSuccess=OrderSelect(FB1id, SELECT_BY_TICKET); if(isSelectSuccess) { if((OrderType()==OP_BUY) && (OrderCloseTime()==0))isCloseSuccess=OrderClose(FB1id, OrderLots(), Bid, 10*Point, CLR_NONE); if((OrderType()==OP_BUYSTOP) && (OrderCloseTime()==0))isCloseSuccess=OrderDelete(FB1id); } isSelectSuccess=OrderSelect(FB2id, SELECT_BY_TICKET); if(isSelectSuccess) { if((OrderType()==OP_BUY) && (OrderCloseTime()==0))isCloseSuccess=OrderClose(FB2id, OrderLots(), Bid, 10*Point, CLR_NONE); if((OrderType()==OP_BUYSTOP) && (OrderCloseTime()==0))isCloseSuccess=OrderDelete(FB2id); } isSelectSuccess=OrderSelect(FS1id, SELECT_BY_TICKET); if(isSelectSuccess) { if((OrderType()==OP_SELL) && (OrderCloseTime()==0))isCloseSuccess=OrderClose(FS1id, OrderLots(), Ask, 10*Point, CLR_NONE); if((OrderType()==OP_SELLSTOP) && (OrderCloseTime()==0))isCloseSuccess=OrderDelete(FS1id); } isSelectSuccess=OrderSelect(FS2id, SELECT_BY_TICKET); if(isSelectSuccess) { if((OrderType()==OP_SELL) && (OrderCloseTime()==0))isCloseSuccess=OrderClose(FS2id, OrderLots(), Ask, 10*Point, CLR_NONE); if((OrderType()==OP_SELLSTOP) && (OrderCloseTime()==0))isCloseSuccess=OrderDelete(FS2id); } if(isCloseSuccess==false)Alert("Something wrong with close orders, codeErr = "+GetLastError()); return(0); } int DifMA(int offset) { double iMA2 = iMA(NULL, 0, FastMA, 0, EMA1Mode, EMA1Type, offset); double iMA10 = iMA(NULL, 0, SlowMA, 0, EMA2Mode, EMA2Type, offset); int res = (iMA2-iMA10)/Point; return(res); } int start() { /////// Цыкл Системы /////// if(TimeDay(TimeCurrent())!=CurrentDay)//Инициализация ордеров в начале дня { if(expirationForOrders==false)DeleteOrders();//проверка на запуск советника InitializeFiboLevels(); SetStopOrders(); CurrentDay = TimeDay(TimeCurrent()); return(0); } if(SystemState==0)//Если система в режиме ожидания ждем открытия ордера { CurrentOrderId = CheckOpenOrder(); if(CurrentOrderId!=0) { SystemState=1;//Состояние системы изменилось на открыты ордер } } if(SystemState==1)//Если система в режиме открытия ордера - следит за установкой ордера в безубыток { OrderSelect(CurrentOrderId, SELECT_BY_TICKET); if(OrderCloseTime()==0)//Если открытый ордер не закрыт { bool isSuccess; //delta = (Ask - OrderOpenPrice())/Point; //растояние между ценой и открытием ордера if((OrderComment()=="FB1")&&(DifMA(0)<-StopMA))//если ордер на покупку 1 { isSuccess=OrderClose(FB1id, OrderLots(), Bid, 10*Point, CLR_NONE); if(isSuccess)SystemState=3; else Alert("Something wrong with order Close"); return(0); } if((OrderComment()=="FB2")&&(DifMA(0)<-StopMA))//если ордер на покупку 2 { isSuccess=OrderClose(FB2id, OrderLots(), Bid, 10*Point, CLR_NONE); if(isSuccess)SystemState=3; else Alert("Something wrong with order Close"); return(0); } delta = (OrderOpenPrice()-Bid)/Point; if((OrderComment()=="FS1")&&(DifMA(0)>StopMA))//если ордер на продажу 1 { isSuccess=OrderClose(FS1id, OrderLots(), Ask, 10*Point, CLR_NONE); if(isSuccess)SystemState=3; else Alert("Something wrong with order Close"); return(0); } if((OrderComment()=="FS2")&&(DifMA(0)>StopMA))//если ордер на продажу 2 { isSuccess=OrderClose(FS2id, OrderLots(), Ask, 10*Point, CLR_NONE); if(isSuccess)SystemState=3; else Alert("Something wrong with order Close"); return(0); } }else//Если ордер закрыт меняем состояние системы { if(OrderClosePrice()==OrderStopLoss())SystemState=3;//Переводим систему в режим Стоплосса чтоб она открыла новый ордер когда будет подходящий момент if(OrderClosePrice()==OrderTakeProfit()) { if(CurrentOrderId == FB1id)OrdFin[0]=1; if(CurrentOrderId == FB2id)OrdFin[1]=1; if(CurrentOrderId == FS1id)OrdFin[2]=1; if(CurrentOrderId == FS2id)OrdFin[3]=1; SystemState=0;//Первый профит взяли переводим систему в состояние ожидания слудующего ордера } return(0); } } if(SystemState==2)//Система в режиме ордера безубытка и ждет либо стопЛосса либо профита { OrderSelect(CurrentOrderId, SELECT_BY_TICKET); if(OrderClosePrice()==OrderStopLoss()){SystemState=3; return(0);}//Переводим систему в режим Стоплосса чтоб она открыла новый ордер когда будет подходящий момент if(OrderClosePrice()==OrderTakeProfit()){SystemState=0; return(0);}//Первый профит взяли переводим систему в состояние ожидания слудующего ордера } if(SystemState==3)//Если Система в режиме остановки ордера по стоплоссу { if(ReopenOrders==false) { SystemState = 0;//ждем следующего ордера return(0); } OrderSelect(CurrentOrderId, SELECT_BY_TICKET); if((OrderType()==OP_BUY) && (OrderCloseTime()>0)) { delta = (OrderOpenPrice()-Ask)/Point; if((OrderComment()=="FB1[sl]")&&(delta>border))//если ордер на покупку 1 { if(OrdFin[0]==0)FB1id=OrderSend(Symbol(), OP_BUYSTOP, Lots, FB1, 0.01, FB1-FB1SafeLoss*Point, FB2, "FB1", MagicNumber, expDate, MediumBlue); SystemState=0; return(0); } if((OrderComment()=="FB2[sl]")&&(delta>border))//если ордер на покупку 2 { if(OrdFin[1]==0)FB2id = OrderSend(Symbol(), OP_BUYSTOP, Lots, FB2, 0.01, FB2-FB2SafeLoss*Point, FB3, "FB2", MagicNumber, expDate, MediumBlue); SystemState=0; return(0); } } if((OrderType()==OP_SELL) && (OrderCloseTime()>0)) { delta = (Bid-OrderOpenPrice())/Point; if((OrderComment()=="FS1[sl]")&&(delta>border))//если ордер на покупку 1 { if(OrdFin[2]==0)FS1id = OrderSend(Symbol(), OP_SELLSTOP, Lots, FS1, 0.01, FS1+FS1SafeLoss*Point, FS2, "FS1", MagicNumber, expDate, IndianRed); SystemState=0; return(0); } if((OrderComment()=="FS2[sl]")&&(delta>border))//если ордер на покупку 2 { if(OrdFin[3]==0)FS2id = OrderSend(Symbol(), OP_SELLSTOP, Lots, FS2, 0.01, FS2+FS2SafeLoss*Point, FS3, "FS2", MagicNumber, expDate, IndianRed); SystemState=0; return(0); } } } //---- return(0); } //+------------------------------------------------------------------+