//+------------------------------------------------------------------+ //| Fibo Open Day Safe.mq4 | //| Copyright © 2009, Стеценко Дмитрий Дмитриевич | //| http:// | //+------------------------------------------------------------------+ #property copyright "Copyright © 2009, Стеценко Дмитрий Дмитриевич" #property link "http://" extern double Lots = 0.01; // Внешняя переменная extern int MagicNumber = 777; int Count=0; 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]; extern int border=3; extern bool ReopenOrders=true; extern int FB1SafeLoss = 10, FB1SafeProfitTrailLevel = 10, FB1SafeProfit = 1;// SafeLoss - начальный СтопЛосс для ордера, extern int FB2SafeLoss = 10, FB2SafeProfitTrailLevel = 10, FB2SafeProfit = 1;// SafeProfitTrailLevel - уровнь при котором ордер трейлится extern int FS1SafeLoss = 10, FS1SafeProfitTrailLevel = 10, FS1SafeProfit = 1;// SafeProfit - количество пунктов минимального выигрыша вместо лося extern int FS2SafeLoss = 10, FS2SafeProfitTrailLevel = 10, FS2SafeProfit = 1; int FB1id, FB2id, FS1id, FS2id; //////// ------------ ///////// datetime expDate; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- CurrentDay=TimeDay(TimeCurrent()); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int InitializeFiboLevels() { SystemState = 0;//режим ожидания openPrice = Ask-Point; FB1 = openPrice + 0.0034; FB2 = openPrice + 0.0089; FB3 = openPrice + 0.0144; FS1 = openPrice - 0.0034; FS2 = openPrice - 0.0089; FS3 = openPrice - 0.0144; OrdFin[0]=0; OrdFin[1]=0; OrdFin[2]=0; OrdFin[3]=0; expDate = TimeCurrent() + 86000; return(0); } int SetStopOrders() { FB1id = OrderSend(Symbol(), OP_BUYSTOP, Lots, FB1, 0.01, FB1-FB1SafeLoss*Point, FB2, "FB1", MagicNumber, expDate, MediumBlue); FS1id = OrderSend(Symbol(), OP_SELLSTOP, Lots, FS1, 0.01, FS1+FS1SafeLoss*Point, FS2, "FS1", MagicNumber, expDate, IndianRed); FB2id = OrderSend(Symbol(), OP_BUYSTOP, Lots, FB2, 0.01, FB2-FB2SafeLoss*Point, FB3, "FB2", MagicNumber, expDate, MediumBlue); FS2id = OrderSend(Symbol(), OP_SELLSTOP, Lots, FS2, 0.01, FS2+FS2SafeLoss*Point, FS3, "FS2", MagicNumber, expDate, IndianRed); return(0); } int CheckOpenOrder() { //Если отложеный стал на продажу или на покупку OrderSelect(FB1id, SELECT_BY_TICKET, MODE_TRADES); if((OrderType()==OP_BUY) && (OrderCloseTime()==0))return(FB1id); OrderSelect(FB2id, SELECT_BY_TICKET, MODE_TRADES); if((OrderType()==OP_BUY) && (OrderCloseTime()==0))return(FB2id); OrderSelect(FS1id, SELECT_BY_TICKET, MODE_TRADES); if((OrderType()==OP_SELL) && (OrderCloseTime()==0))return(FS1id); OrderSelect(FS2id, SELECT_BY_TICKET, MODE_TRADES); if((OrderType()==OP_SELL) && (OrderCloseTime()==0))return(FS2id); return(0); } int start() { /////// Цыкл Системы /////// if(TimeDay(TimeCurrent())!=CurrentDay)//Инициализация ордеров в начале дня { 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; int delta = (Ask - OrderOpenPrice())/Point; //растояние между ценой и открытием ордера if((OrderComment()=="FB1")&&(delta>FB1SafeProfitTrailLevel))//если ордер на покупку 1 { isSuccess=OrderModify(CurrentOrderId, OrderOpenPrice(), OrderOpenPrice()+FB1SafeProfit*Point, OrderTakeProfit(), OrderExpiration(), DarkGreen); if(isSuccess)SystemState=2; else Alert("Something wrong with order modify"); return(0); } if((OrderComment()=="FB2")&&(delta>FB2SafeProfitTrailLevel))//если ордер на покупку 2 { isSuccess=OrderModify(CurrentOrderId, OrderOpenPrice(), OrderOpenPrice()+FB2SafeProfit*Point, OrderTakeProfit(), OrderExpiration(), DarkGreen); if(isSuccess)SystemState=2; else Alert("Something wrong with order modify"); return(0); } delta = (OrderOpenPrice()-Bid)/Point; if((OrderComment()=="FS1")&&(delta>FS1SafeProfitTrailLevel))//если ордер на продажу 1 { isSuccess=OrderModify(CurrentOrderId, OrderOpenPrice(), OrderOpenPrice()-FS1SafeProfit*Point, OrderTakeProfit(), OrderExpiration(), DarkGreen); if(isSuccess)SystemState=2; else Alert("Something wrong with order modify"); return(0); } if((OrderComment()=="FS2")&&(delta>FS2SafeProfitTrailLevel))//если ордер на продажу 2 { isSuccess=OrderModify(CurrentOrderId, OrderOpenPrice(), OrderOpenPrice()-FS2SafeProfit*Point, OrderTakeProfit(), OrderExpiration(), DarkGreen); if(isSuccess)SystemState=2; else Alert("Something wrong with order modify"); 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)) { Alert("ReOpenOrder BUY"); 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); } //+------------------------------------------------------------------+