//+------------------------------------------------------------------+ //| fractional.mq5 | //| Copyright 2019, Dmitrievsky Max. | //| https://www.mql5.com/en/users/dmitrievsky | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, Dmitrievsky Max." #property link "https://www.mql5.com/en/users/dmitrievsky" #property version "1.00" #include #include #include #include "Auto_optimizer.mqh" input int History_depth = 1000; input double FracDiff = 0.65; input int Entropy_window = 50; input int Recalc_period = 100; sinput double MaximumRisk=0.01; sinput double CustomLot=0; //input int Stop_loss = 500; //Stop loss, positions protection input int Stop_loss = 50; //Stop loss, positions protection //input int BreakEven = 300; //Break even input int BreakEven = 30; //Break even sinput int OrderMagic=111; input double probab = 0.0; // probabilidade static datetime last_time=0; CAuto_optimizer *optimizer = new CAuto_optimizer(History_depth , // 1000 Recalc_period , // 100 FracDiff , // 0.15 Entropy_window, // 50 probab ); double sig1; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit() { return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if(!isNewBar()) return; MqlDateTime dt; TimeCurrent(dt); if( dt.hour == 9 ){ if( dt.min < 10 ) return; } if( dt.hour >= 16 ){ if( dt.min > 0 ) return; } Trailing_fnc(Stop_loss, BreakEven); sig1 = optimizer.getTradeSignal(); placeOrders(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void placeOrders(){ if(countOrders(0)!=0 || countOrders(1)!=0) { for(int b=OrdersTotal()-1; b>=0; b--) if(OrderSelect(b,SELECT_BY_POS)==true) { Print("sig1:",sig1); if(OrderType()==0 && sig1 < 0.5-probab) if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red )) {}; if(OrderType()==1 && sig1 > 0.5+probab) if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Blue)) {}; } } if(countOrders(0)!=0 || countOrders(1)!=0) return; //double prices[]; //CopyClose(NULL, 0, 0, 500, prices); //if(sample_entropy(prices, 2, 0.2, ArraySize(prices), MathStandardDeviation(prices))< 0.4) return; if(sig1 > 0.5+probab && (OrderSend(Symbol(),OP_BUY,lotsOptimized(),SymbolInfoDouble(_Symbol,SYMBOL_ASK),0,0,0,NULL,OrderMagic,INT_MIN)>0)) { do {Trailing_fnc(Stop_loss,BreakEven);} while(countOrders()==0); return; } if(sig1 < 0.5-probab && (OrderSend(Symbol(),OP_SELL,lotsOptimized(),SymbolInfoDouble(_Symbol,SYMBOL_BID),0,0,0,NULL,OrderMagic,INT_MIN)>0)) { do {Trailing_fnc(Stop_loss,BreakEven);} while(countOrders()==0);} } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ int countOrders() { int result=0; for(int k=0; k0.0000001) lot=ratio*volume_step; if(lotSymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX)) lot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX); return(lot); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool isNewBar() { datetime lastbar_time=datetime(SeriesInfoInteger(Symbol(),_Period,SERIES_LASTBAR_DATE)); if(last_time==0) { last_time=lastbar_time; return(false); } if(last_time!=lastbar_time) { last_time=lastbar_time; return(true); } return(false); } //+------------------------------------------------------------------+ //| Expert ontester function | //+------------------------------------------------------------------+ double OnTester() { delete optimizer; return(0.0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(MQLInfoInteger(MQL_TESTER)==false) { delete optimizer; } } //+------------------------------------------------------------------+ //| Trailing function | //+------------------------------------------------------------------+ int Trailing_fnc(int trail_p,int breakeven) { int result=0; for(int i=0;iOrderOpenPrice()+ breakeven*SymbolInfoDouble(_Symbol,SYMBOL_POINT)+ SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)*SymbolInfoDouble(_Symbol,SYMBOL_POINT) && SymbolInfoDouble(_Symbol,SYMBOL_BID)-breakeven*SymbolInfoDouble(_Symbol,SYMBOL_POINT)- SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)*SymbolInfoDouble(_Symbol,SYMBOL_POINT)>OrderStopLoss()) { if(!OrderModify(OrderTicket(),OrderOpenPrice(),SymbolInfoDouble(_Symbol,SYMBOL_BID)-breakeven*SymbolInfoDouble(_Symbol,SYMBOL_POINT),OrderTakeProfit(),OrderExpiration(),0)) {result=1;} } else if(!OrderStopLoss()) if(!OrderModify(OrderTicket(),OrderOpenPrice(),SymbolInfoDouble(_Symbol,SYMBOL_BID)- trail_p*SymbolInfoDouble(_Symbol,SYMBOL_POINT)-SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)*SymbolInfoDouble(_Symbol,SYMBOL_POINT),OrderTakeProfit(),OrderExpiration(),0)) {result=1;} } if(OrderType() == 1) { if(SymbolInfoDouble(_Symbol,SYMBOL_ASK)