//+------------------------------------------------------------------+ //| stohastic_system.mq4 | //| Павел Смирнов | //| www.autoforex.ru | //+------------------------------------------------------------------+ #property copyright "Павел Смирнов" #property link "www.autoforex.ru" extern int TakeProfit=10; extern int NWave=2; extern int K=9; extern int D=3; extern int slowing=5; extern int Average_method=2; extern int price_field=0; int K_level=0; int down=0; int up=0; void CloseDirect(int cntr, string comm) { double closeprice; if(OrderSelect(cntr,SELECT_BY_POS,MODE_TRADES)) { RefreshRates(); if (OrderType()==OP_BUY) closeprice=Bid; else closeprice=Ask; if (OrderClose(OrderTicket(),OrderLots(),closeprice,10,Green)) { Print(comm, OrderTicket()); } else { Print("ОШИБКА в CloseDirect():OrderClose() - ",GetLastError()); } } else { Print("ОШИБКА в CloseDirect():OrderSelect() - ",GetLastError()); } } int init() { return(0); } int deinit() { return(0); } int start() { int ticket=0; double stoch_1=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,1); double stoch_2=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,2); double stoch_3=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,3); int Hour_curr=TimeHour(TimeCurrent()); if ((stoch_1>70)&&(stoch_2>50)) K_level=70; if ((stoch_1<30)&&(stoch_2<50)) K_level=30; if(OrdersTotal()<1) { if((Hour_curr>=13)&&(Hour_curr<21))//проверка сигналов только в этот промежуток времени { if((K_level==30)&&(stoch_1>50.0))//сигнал на покупку { RefreshRates(); Print("Сигнал на покупку. stoch_1=",stoch_1," stoch_2=",stoch_2); ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,"buy_order1",1,0,Red); ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,Ask+TakeProfit*Point,"buy_order2",2,0,Red); K_level=50; down=0; } if((K_level==70)&&(stoch_1<50.0))//сигнал на продажу { RefreshRates(); Print("Сигнал на продажу. stoch_1=",stoch_1," stoch_2=",stoch_2); ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,10,0,0,"sell_order1",1,0,Blue); ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,10,0,Bid-TakeProfit*Point,"sell_order2",2,0,Red); K_level=50; up=0; } } } // блок закрытия всех открытых ордеров в случае, если рынок пошел не в нашу сторону if (OrdersTotal()>=1) { if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)) { if(OrderType()==OP_BUY) { if(stoch_1<=40) while(OrdersTotal()>0) { CloseDirect(0,"Принудительное закрытие сделки при обратном движении рынка, ticket="); } } if(OrderType()==OP_SELL) { if(stoch_1>=60) while(OrdersTotal()>0) { CloseDirect(0,"Принудительное закрытие сделки при обратном движении рынка, ticket="); } } } else { Print("ОШИБКА в Start()(блок закрытия при обратном движении) :OrderSelect() - ",GetLastError()); return(-1); } } // блок закрытия на 2-ом снижении (повышении) Стохастика. if (OrdersTotal()>=1) { if ((stoch_1stoch_2)&&(stoch_3>stoch_2)) up++; if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)) { if(OrderType()==OP_BUY) { if(down==NWave) while(OrdersTotal()>0) { CloseDirect(0,"Закрытие всех BUY-сделок после второго подьема, stoh_1="+stoch_1+" stoch_2="+stoch_2+" stoch_3="+stoch_3+" ticket="); } } if(OrderType()==OP_SELL) { if(up==NWave) while(OrdersTotal()>0) { CloseDirect(0,"Закрытие всех SELL-сделок после второго подьема, stoh_1="+stoch_1+" stoch_2="+stoch_2+" stoch_3="+stoch_3+" ticket="); } } } else { Print("ОШИБКА в Start():OrderSelect() - ",GetLastError()); return(-1); } } if (Hour_curr>=22)//безусловное закрытие всех позиций { while(OrdersTotal()>0) { CloseDirect(0,"Принудительное закрытие сделки в 22.00, ticket="); } } return(0); }