//+------------------------------------------------------------------+ //| $Titanic.mq4 | //| Alex | //| al5@yandex.ru | //+------------------------------------------------------------------+ #property copyright "Alex" #property link "al5@yandex.ru" /* â ñîâåòíèêå çàëîæåíà ìûñëü ,÷òî ðûíîê íàõîäèòñÿ â êâàçèóñòîé÷èâîì ñîñòîÿíèè íåêîòîðîå âðåìÿ â ïðîñòîíàðîäèè òðåíä è ôëåò , ê ýòèì ïîíÿòèÿì íàäî äîáàâèòü åùå ïóøèñòîñòü ðûíêà .ò å åñëè äâèæåíèå íà÷àëîñü òî îíî ñêîðåå âñåãî ïðîäîëæèòñÿ è ó êàæäîãî äâèæåíèÿ áóäåò îòêàò âîïðîñ çàêëþ÷àåòñÿ â ïðàâèëüíîñòè ïàðàìåòðîâ ñòîïîâ è ïðîôèòîâ äëÿ ýòîé ôàçû ðûíêà è ïðèìåíåíèèè ñòðàòåãèè íà îòêàòàõ èëè íà ïðîäîëæåíèè äâèæåíèÿ. ×òîáû íå äóìàòü ïðî îïòèìèçàöèþ âåäåòñÿ âèðòóàëüíî ñðàçó 640 âîçìîæíûõ êîìáèíàöèé,òî ÷òî ÿâëÿåòñÿ ëó÷øèì îòáèðàåòñÿ äëÿ ðåàëüíîé òîðãîâëè . Äëÿ óìåíüøåíèÿ êîë-âà ñòðàòåãèé ñòîï ëîññ òàêæå ÿâëÿåòñÿ òðåéëèíãîì ,êîòîðûé íà÷èíàåò äâèæåíèå ñðàçó íå äîæèäàÿñü ïðîôèòà . */ double Resultat_v[256,644] ;// ìàññèâ ðåçóëüòàòîâ òîðãîâëè double Torgovlya_v[7,644] ;// ìàññèâ îïèñàíèÿ îðäåðîâ // òîðã îïåðàöèÿ, öåíà îòêðûòèÿ, ñòîï ëîññ, òåéê ïðîôèò, ôëàã ñîñòîÿíèÿ ïîçèöèè, ìàãèê, ïðèáûëü çàêðûòîãî îðäåðà int Flag[644] ;// ìàññèâ ôëàãîâ äëÿ êîíòðîëÿ ïîçèöèè double ExpectPayoff[644]; // ìàññèâ ìàòåìàòè÷åñêèõ îæèäàíèé ïî 10 ïîñëåäíèì ñäåëêàì int Strategi[100,2] ; //ìàññèâ â êîòîðîì õðàíÿòñÿ íîìåðà ñòðàòåãèé . double Lot=0.1 ; //==================================================================== int init() { //èíèöèàëèçàöèÿ ìàññèâà îðäåðîâ for (int i=0 ; i<=643 ;i++) { Torgovlya_v[0,i]=-1.0; ExpectPayoff[i]=-1 ; } for ( i=0 ; i<=9 ;i++) { Strategi[i,0]=-2 ; Strategi[i,1]=-5 ; } //---- return(0); } //==================================================================== int deinit() { return(0); } //=================================================================== int start() { int regim,SL,cde,aaa,MagicReal,regim_1 ; double OpenPrice,Magic_Long,Magic_Short_Real,Magic_Short,Magic_Long_Real,ClosePrice ; bool ccc ; static int ddd=-1 ; //Print("ôóíêöèÿ ñòàðò íà÷àëà ðàáîòû"); for (int i=40 ;i<=120 ; i++) { Magic_Long=10000+i ; Magic_Short_Real=20000+i ; Magic_Short=30000+i ; Magic_Long_Real=40000+i ; if ( Digits==3 || Digits==5 ) SL=i*10 ; else SL=i ; regim_1=TipeOrder_v(Magic_Long) ; // Print("Magic_Long",Magic_Long); // Print("regim",regim); switch (regim_1) { case -1 : //Âûñòàâèòü îòëîæåííûé îðäåð íà ïîêóïêó åñëè îðäåðîâ íà ïîêóïêó íåò // Çàêðûòü îðäåð íà ïðîäàæó ñ Magic_Short_Real OrderSend_v(4.0,Ask+SL*Point,Ask,Ask+2*SL*Point,0.0,Magic_Long,0.0) ; cde=TipeOrder_v(Magic_Short_Real) ; aaa=index_v(Magic_Short_Real) ; Flag[aaa]=0 ; if (cde==1 )// åñëè èìååòñÿ îòêðûòûé îðäåð íà ïðîäàæó ñ Magic_Short_Real çàêðûâàåì åãî { OrderClose_v(Magic_Short_Real) ; // Print("Çàêðûâàåòñ Magic_Short_Real ñ ",Magic_Short_Real) ; // Print("ïðèáûëü " ,Torgovlya_v[6,aaa]*1000); } break ; case 4: // ìîäèôèêàöèÿ îòëîæåííîãî îðäåðà OpenPrice=OrderOpenPrice_v(Magic_Long) ; if ((OpenPrice- Ask)> (SL+50)*Point) { // Print("ìîäèôèêàöèÿ îòëîæåííîãî îðäåðà",Magic_Long); OrderModify_v(Magic_Long,Ask+SL*Point,Ask,Ask+2*SL*Point) ; } break ; case 0: /* åñëè îòëîæåííûé îðäåð Buy_Stop ñðàáàòûâàåò ñòàíîâèòñÿ îðäåðîì Buy òî åãî ìîäèôèöèðóåì ïî ñòîï ëîññó è åñëè ôëàã êîðîòêîé ïîçèöèè =1 òî åå çàíîâî íå îòêðûâàåì , ýòî çíà÷èò ÷òî êîðîòêàÿ ïîçà ëîâÿùàÿ îòêàò áûëà çàêðûòà íà òðåíäå ïî ñòîïó è îòêðûâàòü åå çàíîâî íå íàäî */ ClosePrice=OrderStopLoss_v(Magic_Long) ; if ((Ask-ClosePrice) > (SL+50)*Point) OrderModify_v(Magic_Long,0.0,Ask-SL*Point,0.0) ; regim=TipeOrder_v(Magic_Short_Real) ; // ïðîâåðêà íàëè÷èÿ êîðîòêîé ïîçû aaa=index_v(Magic_Short_Real) ; if (regim==1 || Flag[aaa]==1) break ; OrderSend_v(1.0,Bid,Bid+SL*Point,0.0,0.0,Magic_Short_Real,0.0) ; Flag[aaa]=1 ; // Print("îòêðûâàåì Magic_Short_Real ñ ",Magic_Short_Real) ; break ; } /////////////////////////////////////////////////////////////////////////////////////// regim_1=TipeOrder_v(Magic_Short); switch (regim_1) { case -1: OrderSend_v(5,Bid-SL*Point,Bid,Bid-2*SL*Point,0.0,Magic_Short,0.0) ; cde=TipeOrder_v(Magic_Long_Real) ; aaa=index_v(Magic_Long_Real); Flag[aaa]=0 ; if (cde==0) { OrderClose_v(Magic_Long_Real) ; } case 5: OpenPrice=OrderOpenPrice_v(Magic_Short); if ((Bid-OpenPrice)> (SL+50)*Point) OrderModify_v(Magic_Short,Bid-SL*Point,Bid,Bid-2*SL*Point) ; break ; case 1: ClosePrice=OrderStopLoss_v(Magic_Short) ; if ((ClosePrice-Bid)>(SL+50)*Point) OrderModify_v(Magic_Short,0.0,Bid+SL*Point,0.0) ; regim=TipeOrder_v(Magic_Long_Real); aaa=index_v(Magic_Long_Real) ; if (regim==0 || Flag[aaa]==1) break ; OrderSend_v(0,Ask,Ask-SL*Point,0,0,Magic_Long_Real,0) ; Flag[aaa]=1; break ; } } //---- Vedeniepozi(); ResTorgovlya_v(); aaa=Expected_Payoff_v(); // âîçâðàò èíäåêñà ñòðàòåãèè ãäå ìàò îæèäàíèå áîëüøå âñåãî // Çäåñü çàïîëíÿþòñÿ ñòàðøèå ÿ÷åéêè ìàññèâà ñòðàòåãèé ïîñëåäíåé ïðèøåäøåé ñòðàòåãèåé // ñ ìàêñèìàëüíûì ìàòåìàòè÷åñêèì îæèäàíèåì if (aaa!=ddd) { int www=OrdersTotal() ; Print(" Âñåãî îðäåðîâ â äåëå ðàçðåøåíà óñòàíîâêà îòëîæåííèêîâ ",www); Print("Ìàòîæèäàíèå ",ExpectPayoff[aaa]) ; for ( i=1 ; i<=99 : ; i++) { Strategi[i-1,0]=Strategi[i,0] ; Strategi[i-1,1]=Strategi[i,1] ; } if (aaa==0) MagicReal=MathRand()+1 ; else MagicReal=aaa ; ccc=true ; while ( ccc) { for ( i=0 ;i<=99 ; i++) { if ( MagicReal==Strategi[i,1] ) { ccc=true ; MagicReal=MagicReal+MathRand()+1 ; break ; } ccc=false ; } } Strategi[99,0]=aaa ; Strategi[99,1]=MagicReal ; ddd=aaa ; } // åñëè ìàò æèäàíèåïîñëåäíåé ñòðàòåãèè ïîëîæèòåëüíî òî åå êîïèðóåì â ðåàëüíóþ ñäåëêó if ( aaa >= 0 ) { Copy_Position_r(Strategi[99,0],Strategi[99,1]) ; } for ( i=0 ; i<=98 ; i++ ) { // åñëè íåò ðåàëüíîãî îðäåðà ñ òàêèì ìàãèêîì òî îñâîáîæäàåì ÿ÷åéêó â ìàññèâå Strategi if ( Type_Order_r(Strategi[i,1]) < 0) { Strategi[i,0]=-2 ; Strategi[i,1]=-1 ; continue ; } // åñëè ðåàëüíûé îðäåð ñ òàêèì ìàãèêîì ÿâëÿåòñÿ îòëîæåííûì òî åãî óäàëÿåì if (Type_Order_r(Strategi[i,1]) >1 ) { Delete_Position_r(Strategi[i,0],Strategi[i,1]) ; continue ; } Copy_Position_r(Strategi[i,0],Strategi[i,1]) ; } // Óäàëåíèå èç ìàññèâà âñåõ îòðàáîòàííûõ ñòðàòåãèé ñî ñäâèãîì âïðàâî â ðåçóëüòàòå â ñòàðøèõ èíäåêñàõ íàõîäÿòñÿ // ìàãèêè èíäåêñû ñòðàòåãèé êîòîðûå â äàííûé ìîìåíò ðàáîòàþò for ( i=99 ;i<=1 ;i--) { if ( Strategi[i,0]==-2 ) { for ( int j=i ; j<=1 ; j-- ) { Strategi[j,0]=Strategi[j-1,0] ; Strategi[j,1]=Strategi[j-1,1] ; } Strategi[0,0]=-2 ; Strategi[0,1]=-1 ; } } return(0); } //=================================================================== int index_v( int magic) // ôóíêöèÿ âîçâðàùàåò èíäåêñ äëÿ ìàññèâà ïî ìàãèêó { int index=0,aaa,bbb,ccc ; aaa=magic/10000.0 ; if (aaa==1) return(magic-aaa*10000-40) ; if (aaa==2) return(magic-aaa*10000-40+161) ; if (aaa==3) return(magic-aaa*10000-40+322) ; if (aaa==4) return(magic-aaa*10000-40+483) ; return(index) ; } //==================================================================== void OrderModify_v(int magic,double OpenPrice,double StopLoss,double TeikProfit) { int index=index_v(magic) ; int aaa ; aaa=Torgovlya_v[0,index] ; switch (aaa) { // ïðîâåðêà íà âøèâîñòü ìîäèôèêàöèè îðäåðà Buy case 0: if ((Torgovlya_v[0,index]==0.0 && TeikProfit!=0.0 && Ask > TeikProfit) || (Torgovlya_v[0,index]==0.0 && StopLoss!=0.0 && Ask < StopLoss)) { Print("Îøèáêà ìîäèôèêàöèè îðäåðà Buy ñ ìàãèêîì ",magic); } break ; // ïðîâåðêà íà âøèâîñòü ìîäèôèêàöèè îðäåðà Sell case 1: if ((Torgovlya_v[0,index]==1.0 && TeikProfit!=0.0 && Bid < TeikProfit) || (Torgovlya_v[0,index]==1.0 && StopLoss!=0.0 && Bid > StopLoss)) { Print("Îøèáêà ìîäèôèêàöèè îðäåðà Buy ñ ìàãèêîì ",magic); } break ; // ïðîâåðêà íà âøèâîñòü ìîäèôèêàöèè îðäåðà BuyLimit case 2: if ((Torgovlya_v[0,index]==2.0 && Ask < OpenPrice) || (Torgovlya_v[0,index]==2.0 && TeikProfit!=0.0 && TeikProfit < OpenPrice) || (Torgovlya_v[0,index]==2.0 && StopLoss!=0.0 && StopLoss > OpenPrice)) { Print("Îøèáêà ìîäèôèêàöèè îðäåðà BuyLimit ñ ìàãèêîì ",magic); } break ; // ïðîâåðêà íà âøèâîñòü ìîäèôèêàöèè îðäåðà SellLimit case 3: if ((Torgovlya_v[0,index]==3.0 && Bid > OpenPrice) || (Torgovlya_v[0,index]==3.0 && TeikProfit!=0.0 && TeikProfit > OpenPrice) || (Torgovlya_v[0,index]==3.0 && StopLoss!=0.0 && StopLoss < OpenPrice)) { Print("Îøèáêà ìîäèôèêàöèè îðäåðà SellLimit ñ ìàãèêîì ",magic); } break ; // ïðîâåðêà íà âøèâîñòü ìîäèôèêàöèè îðäåðà BuyStop case 4: if ((Torgovlya_v[0,index]==4.0 && Ask > OpenPrice) || (Torgovlya_v[0,index]==4.0 && TeikProfit!=0.0 && TeikProfit < OpenPrice) || (Torgovlya_v[0,index]==4.0 && StopLoss!=0.0 && StopLoss > OpenPrice)) { Print("Îøèáêà ìîäèôèêàöèè îðäåðà BuyLimit ñ ìàãèêîì ",magic); } break ; // ïðîâåðêà íà âøèâîñòü ìîäèôèêàöèè îðäåðà SellStop case 5: if ((Torgovlya_v[0,index]==5.0 && Bid < OpenPrice) || (Torgovlya_v[0,index]==5.0 && TeikProfit!=0.0 && TeikProfit > OpenPrice) || (Torgovlya_v[0,index]==5.0 && StopLoss!=0.0 && StopLoss < OpenPrice)) { Print("Îøèáêà ìîäèôèêàöèè îðäåðà SellLimit ñ ìàãèêîì ",magic); } break ; } //Óñòàíîâêà öåíû îòêðûòèÿ ñòîïà è òåéêà äëÿ îòëîæåííûõ îðäåðîâ if (Torgovlya_v[0,index] > 1 ) { Torgovlya_v[1,index]=NormalizeDouble(OpenPrice,Digits) ; Torgovlya_v[2,index]=NormalizeDouble(StopLoss,Digits) ; Torgovlya_v[3,index]=NormalizeDouble(TeikProfit,Digits) ; Torgovlya_v[4,index]=0.0 ; Torgovlya_v[6,index]=0.0 ; return (0) ; } if (StopLoss != 0.0 ) Torgovlya_v[2,index]=NormalizeDouble(StopLoss,Digits) ; if (TeikProfit != 0.0) Torgovlya_v[3,index]=NormalizeDouble(TeikProfit,Digits) ; return(0) ; } //======================================================================= // Ôóíêöèÿ ïåðâîíà÷àëüíîé óñòàíîâêè âèðòóàëüíûõ îðäåðîâ void OrderSend_v(double TorgOperation,double OpenPrice,double StopLoss,double TeikProfit,double FlagWork,double magic,double Pribil) { int index=index_v(magic) ; //ïðîâåðêà íà âøèâîñòü óñòàíîâêè îðäåðà Buy if (TorgOperation==0.0 && (TeikProfit!=0.0 && TeikProfit < OpenPrice) || (StopLoss!=0.0 && StopLoss > OpenPrice)) { Print("Îøèáêà óñòàíîâêè îðäåðà Buy ñ ìàãèêîì ",magic); deinit() ; } //ïðîâåðêà íà âøèâîñòü óñòàíîâêè îðäåðà Sell if (TorgOperation==1.0 && (TeikProfit!=0 && TeikProfit > OpenPrice) || (StopLoss!=0.0 && StopLoss < OpenPrice)) { Print("Îøèáêà óñòàíîâêè îðäåðà Sell ñ ìàãèêîì ",magic); deinit() ; } //ïðîâåðêà íà âøèâîñòü óñòàíîâêè îðäåðà BuyLimit if (TorgOperation==2.0 && (Ask < OpenPrice || (TeikProfit!=0.0 && TeikProfit < OpenPrice) || (StopLoss!=0.0 && StopLoss > OpenPrice))) { Print("Îøèáêà óñòàíîâêè îðäåðà BuyLimit ñ ìàãèêîì ",magic); deinit() ; } //ïðîâåðêà íà âøèâîñòü óñòàíîâêè îðäåðà SellLimit if (TorgOperation==3.0 && (Bid > OpenPrice || (TeikProfit!=0.0 && TeikProfit > OpenPrice) || (StopLoss!=0.0 && StopLoss < OpenPrice))) { Print("Îøèáêà óñòàíîâêè îðäåðà SellLimit ñ ìàãèêîì ",magic); deinit() ; } //ïðîâåðêà íà âøèâîñòü óñòàíîâêè îðäåðà BuyStop if (TorgOperation==4.0 && (Ask > OpenPrice || (TeikProfit!=0.0 && TeikProfit < OpenPrice) || (StopLoss!=0.0 && StopLoss > OpenPrice))) { Print("Îøèáêà óñòàíîâêè îðäåðà BuyStop ñ ìàãèêîì ",magic); deinit() ; } //ïðîâåðêà íà âøèâîñòü óñòàíîâêè îðäåðà SellStop if (TorgOperation==5.0 && (Bid < OpenPrice || (TeikProfit!=0.0 && TeikProfit > OpenPrice) || (StopLoss!=0.0 && StopLoss < OpenPrice))) { Print("Îøèáêà óñòàíîâêè îðäåðà SellStop ñ ìàãèêîì ",magic); deinit() ; } Torgovlya_v[0,index]=TorgOperation ; Torgovlya_v[1,index]=OpenPrice ; Torgovlya_v[2,index]=StopLoss ; Torgovlya_v[3,index]=TeikProfit ; Torgovlya_v[4,index]=0.0 ; Torgovlya_v[5,index]=magic ; Torgovlya_v[6,index]=0.0 ; return (0) ; } //============================================================================================== void Vedeniepozi() { //ôóíêöèÿ êîòîðàÿ ïðîáåãàåò ïî ìàññèâó ïîçèöèé , çàêðûâàåò ïîçû ïî òåéêó èëè ñòîïó ,ïåðåâîäèò îòëîæåííûå îðäåðà â // ñðàáîòàâøèå çàïèñûâàåò â ñîîòâåòñòâóþùóþ ÿ÷åéêó ïðèáûëü/ óáûòîê è óñòàíàâëèâàåò ôëàãè äëÿ óïðàâëåíèÿ ïîçèöèÿìè for(int index=0 ;index<=643 ; index++) { //Ïîçèöèÿ Buy òîëüêî ÷òî óñòàíîâëåíà íåîáõîäèìî ñîâåðøèòü ïîêóïêó ïî òåêóùåìó Ask if (Torgovlya_v[0,index]==0.0 && Torgovlya_v[4,index]==0.0) { Torgovlya_v[1,index]=Ask ; Torgovlya_v[4,index]=1.0 ; continue ; } //Ïîçèöèÿ Sell òîëüêî ÷òî óñòàíîâëåíà íåîáõîäèìî ñîâåðøèòü ïðîäàæó ïî òåêóùåìó Bid if (Torgovlya_v[0,index]==1.0 && Torgovlya_v[4,index]==0.0) { Torgovlya_v[1,index]=Bid ; Torgovlya_v[4,index]=1.0 ; continue ; } //Ïîçèöèÿ Buy àêòèâíà íåîáõîäèìî åå ïðîâåðèòü íà ñòîïû è ïðîôèò // ïðîâåðêà íà ïðîôèò if(Torgovlya_v[0,index]==0.0 && Torgovlya_v[4,index]==1.0 && Torgovlya_v[3,index]!=0.0 && Bid > Torgovlya_v[3,index]) { Torgovlya_v[6,index]=Torgovlya_v[3,index]-Torgovlya_v[1,index] ; Torgovlya_v[4,index]=2.0 ; continue ; } // ïðîâåðêà íà ñòîï if(Torgovlya_v[0,index]==0.0 && Torgovlya_v[4,index]==1.0 && Torgovlya_v[2,index]!=0.0 && Bid < Torgovlya_v[2,index]) { Torgovlya_v[6,index]=Torgovlya_v[2,index]-Torgovlya_v[1,index] ; Torgovlya_v[4,index]=2.0 ; continue ; } //Ïîçèöèÿ Sell àêòèâíà íåîáõîäèìî åå ïðîâåðèòü íà ñòîïû è ïðîôèò // ïðîâåðêà íà ïðîôèò if(Torgovlya_v[0,index]==1.0 && Torgovlya_v[4,index]==1.0 && Torgovlya_v[3,index]!=0.0 && Ask < Torgovlya_v[3,index] ) { Torgovlya_v[6,index]=Torgovlya_v[1,index]-Torgovlya_v[3,index] ; Torgovlya_v[4,index]=2.0 ; continue ; } // ïðîâåðêà íà ñòîï if(Torgovlya_v[0,index]==1.0 && Torgovlya_v[4,index]==1.0 && Torgovlya_v[2,index]!=0.0 && Ask > Torgovlya_v[2,index] ) { Torgovlya_v[6,index]=Torgovlya_v[1,index]-Torgovlya_v[2,index] ; Torgovlya_v[4,index]=2.0 ; continue ; } //Ïðîâåðêà îòëîæåííûé îðäåð BuyLimit ñðàáîòàë ñòàë îðäåðîì Buy if (Torgovlya_v[0,index]==2.0 && Ask < Torgovlya_v[1,index] && Torgovlya_v[4,index]!=2.0 ) { Torgovlya_v[0,index]=0.0 ; Torgovlya_v[4,index]=1.0 ; continue ; } //Ïðîâåðêà îòëîæåííûé îðäåð BuyStop ñðàáîòàë ñòàë îðäåðîì Buy if (Torgovlya_v[0,index]==4.0 && Ask > Torgovlya_v[1,index] && Torgovlya_v[4,index]!=2.0 ) { Torgovlya_v[0,index]=0.0 ; Torgovlya_v[4,index]=1.0 ; continue ; } //Ïðîâåðêà îòëîæåííûé îðäåð SellLimit ñðàáîòàë ñòàë îðäåðîì Sell if (Torgovlya_v[0,index]==3.0 && Bid > Torgovlya_v[1,index] && Torgovlya_v[4,index]!=2.0 ) { Torgovlya_v[0,index]=1.0 ; Torgovlya_v[4,index]=1.0 ; continue ; } //Ïðîâåðêà îòëîæåííûé îðäåð SellStop ñðàáîòàë ñòàë îðäåðîì Sell if (Torgovlya_v[0,index]==5.0 && Bid < Torgovlya_v[1,index] && Torgovlya_v[4,index]!=2.0 ) { Torgovlya_v[0,index]=1.0 ; Torgovlya_v[4,index]=1.0 ; continue ; } } //} return(0) ; } //=============================================================================== int TipeOrder_v(int magic) // âîçâðàùàåò òèï âèðòóàëüíîãî îðäåðà ïî åãî ìàãèêó { int index=index_v(magic) ; if (Torgovlya_v[0,index]==0.0) return(0) ; if (Torgovlya_v[0,index]==1.0) return(1) ; if (Torgovlya_v[0,index]==2.0) return(2) ; if (Torgovlya_v[0,index]==3.0) return(3) ; if (Torgovlya_v[0,index]==4.0) return(4) ; if (Torgovlya_v[0,index]==5.0) return(5) ; return(-1); } //================================================================================ void OrderClose_v(int magic) //ôóíêöèÿ çàêðûâàåò ïîçèöèþ ïî ðûíêó åñëè //ïîçà îòëîæåííàÿ òî ïðîñòî óäàëÿåò îðäåð . { int index=index_v(magic) ; if (TipeOrder_v(magic) >1 ) { //îòëîæåííûé îðäåð îáíóëÿåì ÿ÷åéêó Torgovlya_v[4,index]=-2.0 ; } // îðäåðà è òàê íåò ,íà õðåí ýòà çàïèñü íå çíàþ if (TipeOrder_v(magic) ==-1 ) return(0) ; // äåéñòâóþùèé Buy îðäåð if (TipeOrder_v(magic) ==0 ) { Torgovlya_v[6,index]=Bid-Torgovlya_v[1,index] ; Torgovlya_v[4,index]=2.0 ; return(0) ; } //Äåéñòâóþùèé Sell îðäåð if (TipeOrder_v(magic) ==1 ) { Torgovlya_v[6,index]=Torgovlya_v[1,index]-Ask ; Torgovlya_v[4,index]=2.0 ; return(0) ; } return(0) ; } //=============================================================================== void ResTorgovlya_v() //Ôóíêöèÿ ïðîáåãàåò ïî âñåìó ìàññèâó îðäåðîâ è åñëè åñòü çàêðûòûå (îòðàáîòàííûå) // îðäåðà ïðèáûëü/óáûòîê çàïèñûâàåòñÿ â ñîîòâåòñâóþùóþ ÿ÷åéêó â ìàññèâ òîðãîâëè // ïîñëå ýòîãî î÷èùàåò ÿ÷åéêó îðäåðà ðàñ÷èòûâàåò ìàò îæèäàíèå ïî 10 ïîñëåäíèì ñäåëêàì //çàïîëíÿåò ñîîòâ ÿ÷åéêó ìàññèâà ExpectPayoff { int aaa ,ProfitTrades,LossTrades ,k ; double res ,GrossProfit,GrossLoss,ExpPayof; for (int i=0 ; i<=643 ; i++) { if (Torgovlya_v[4,i]==2.0 && Torgovlya_v[6,i]!=0.0) { aaa=SvobodYacheyca_v(i) ; Resultat_v[aaa,i]=Torgovlya_v[6,i] ; if ( aaa > 10 )// åñëè çàïîëíÿåìàÿ ÿ÷åéêà â ìàññèâå ðåçóëüòàòîâ èìååò èíäåêñ áîëüøå 10 ðàñ÷èòûâàì ìàò îæèäàíèå äëÿ ýòîé ñòðàòåãèè { for (int j=aaa-10 ;j<=aaa ; j++) { if (Resultat_v[j,i] > 0.0) { GrossProfit=GrossProfit + Resultat_v[j,i]; ProfitTrades++; } else { LossTrades++; GrossLoss=GrossLoss+Resultat_v[j,i]; } } ExpectPayoff[i]=ProfitTrades / 10 * GrossProfit - LossTrades / 10 * GrossLoss; } ProfitTrades=0; GrossProfit=0.0 ; LossTrades=0 ; GrossLoss=0.0 ; Torgovlya_v[0,i]=-1.0 ; for ( k=1 ;k<=6 ;k++) Torgovlya_v[k,i]=0.0; } if (Torgovlya_v[4,i]==2.0 && Torgovlya_v[6,i]==0.0) { Torgovlya_v[0,i]=-1.0 ; for ( k=1 ;k<=6 ;k++) Torgovlya_v[k,i]=0.0; } } return (0) ; } //============================================================================== int SvobodYacheyca_v(int i) //ôóíêöèÿ âîçâðàùàåò èíäåêñ ñâîáîäíîé ÿ÷åéêè â ìàññèâå ðåçóëüòàòîâ { for (int j=0; j<=255 ; j++) { if ( Resultat_v[j,i]==0.0 ) { return(j); } if( j==255 && Resultat_v[j,i]!=0.0 ) { // åñëè âåñü ìàññèâ çàïîëíåí ñäâèãàåì âëåâî ñ ïîòåðåé ñàìîãî ñòàðøåãî ðåçóëüòàòà for( int k=1 ; k<=255 ; k++) { Resultat_v[k-1,i]=Resultat_v[k,i] ; } } } return(255) ; } //============================================================================= int Expected_Payoff_v() //ôóíêöèÿ âîçâðàùàåò èíäåêñ ñòðàòåãèè ñ ìàêñèìàëüíûì ïîëîæèòåëüíûì ìàò îæèäàíèåì äëÿ çàêëþ÷åíèÿ ðåàëüíûõ ñäåëîê // åñëè òàêîé ñòðàòåãèè íåò âîçâðàùàåò -1 { int bbb=-1; double aaa=0.0; for (int i=0 ;i<= 643 ; i++) if ( ExpectPayoff[i]> aaa && (Torgovlya_v[0,i] >= 0)) // || Torgovlya_v[0,i] == 1)) { aaa=ExpectPayoff[i]; bbb=i ; } return(bbb); } //============================================================================= double OrderOpenPrice_v(int magic) //Ôóíêöèÿ âîçâðàùàåò çíà÷åíèå öåíû îòêðûòèÿ âûáðàííîé ïîçèöèè { int index=index_v(magic) ; return (Torgovlya_v[1,index]); } //============================================================================= double OrderStopLoss_v(int magic) //ôóíêöèÿ âîçâðàùàåò çíà÷åíèå ñòîï ëîñà âûáðàííîé ïîçèöèè { int index=index_v(magic) ; return (Torgovlya_v[2,index]); } /* Expected payoff, ìàòåìàòè÷åñêîå îæèäàíèå âûèãðûøà ðàññ÷èòûâàåòñÿ ïî ñëåäóþùåé ôîðìóëå: Expected Payoff = (ProfitTrades / TotalTrades) * (GrossProfit / ProfitTrades) - (LossTrades / TotalTrades) * (GrossLoss / LossTrades)ãäå: TotalTrades - îáùåå êîëè÷åñòâî ñäåëîê; ProfitTrades - êîëè÷åñòâî ïðèáûëüíûõ ñäåëîê; LossTrades - êîëè÷åñòâî óáûòî÷íûõ ñäåëîê; GrossProfit - îáùàÿ ïðèáûëü; GrossLoss - îáùèé óáûòîê. ExpectPayoff */ //==================================================================================================== int Type_Order_r(int Magic) //Ôóíêöèÿ âîçâðàùàåò òèï îðäåðà ðåàëüíîé ïîçèöèè ïî åãî ìàãèêó { int pos ,ticket; int total=OrdersTotal(); for (pos=0;pos<total;pos++) { if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)==true) { if(OrderMagicNumber()!=Magic) continue ;//âûáðàííûé îðäåð íå íàø ticket=OrderTicket(); if (OrderType()==OP_BUY) return(0) ; if (OrderType()==OP_SELL) return(1) ; if (OrderType()==OP_BUYLIMIT) return(2) ; if (OrderType()==OP_SELLLIMIT) return(3) ; if (OrderType()==OP_BUYSTOP) return(4) ; if (OrderType()==OP_SELLSTOP) return(5) ; } else Print("Îøèáêà â ôóíêöèè Type_Order_r ",GetLastError()); } return(-1); } //=============================================================================================== void Copy_Position_r( int index ,int magic) { //Ôóíêöèÿ êîïèðîâàíèÿ âèðòóàëüíîãî îðäåðà â ðåàëüíûé çäåñü index èíäåêñ ðàáî÷åé ñòðàòåãèè // õàðàêòåðèñòèêè îðäåðà áåðóòñÿ èç ìàññèâà Torgovlya_v , Magic ýòî ìàãèê êîòîðûé íóæíî ïðèñâîèòü ðåàëüíîìó îðäåðó double teik_profit ; double stopp_loss ; double open_price; double stop_level=MarketInfo(Symbol(),MODE_STOPLEVEL) ; double bbb=7* Point; int operation ; operation = Torgovlya_v[0,index] ; teik_profit=Torgovlya_v[3,index] ; stopp_loss=Torgovlya_v[2,index] ; open_price=Torgovlya_v[1,index]; if (Digits == 5 || Digits ==3 ) { bbb=bbb*10 ; } // åñëè òèï âèðòóàëüíîãî îðäåðà íå ðàâåí òèïó ðåàëüíîãî îðäåðà òî ðåàëüíûé îðäåð óäàëÿåì //Print("ìàãèê ,òåéê ïðîôèò, ñòîï ,îòêðûòèå, îïåðàöèÿ ",magic," ",teik_profit," ",stopp_loss," ",open_price," ",operation); //Print("",) ; int aaa=Type_Order_r(magic) ; if (operation!=aaa && aaa>=0) { Delete_Position_r(index,magic) ; return(0) ; } // âûáèðàåì îðäåð ñ ìàãèêîì magic äëÿ äàëüíåéøèõ îïåðàöèé ïîòðåáóåòñÿ åãî ticket int pos ,ticket=-1; int total=OrdersTotal(); for (pos=0;pos<total;pos++) { if(OrderMagicNumber() != magic) continue ;//âûáðàííûé îðäåð íå íàø ticket=OrderTicket(); break ; } if ( ticket!=-1) // òåïåðü çíàåì ìàãèê îðäåðà è åãî òèêåò è âûáðàëè òî÷íî òî ÷òî íàì íóæíî OrderSelect(ticket,SELECT_BY_TICKET) ; //Print("äîáðàëèñü äî óñòàíîâêè ïîçèöèè ñ èíäåêñîì ",index) ; // âû÷èñëÿåì øàã ìîäèôèêàöèè ÷òîáû íå äåðãàòüñÿ ïî êàæäîìó òèêó switch ( operation ) { // ðàáîòàåì ñ ðåàëüíûì îðäåðîì íà ïîêóïêó ñðàâíèâàåì åãî ïðîôèò ,ëîññ è ïðè íåîáõîäèìîñòè ìîäèôèöèðóåì case 0: // åñëè íåò ðåàëüíîãî îðäåðà íà ïîêóïêó óñòàíàâëèâàåì åãî if ( aaa == -1 && MathAbs(Ask- open_price) < bbb) { ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,50,stopp_loss,teik_profit,0,magic,0,CLR_NONE); if (ticket==-1) Print("îøèáêà îòêðûòèÿ îðäåðà íà ïîêóïêó ",GetLastError()) ; break; } if(stopp_loss!=OrderStopLoss() && stopp_loss!=0.0 && MathAbs(Bid-OrderStopLoss()) > stop_level) { if (OrderModify(ticket,0,stopp_loss,0,0,CLR_NONE)== false) { Print ("îøèáêà ìîäèôèêàöèè ëèíèÿ 2 ",GetLastError()) ; Print("Âèðòóàëüíûé ñòîï ëîññ= ",stopp_loss," Ðåàëüíàÿ öåíà ïðåäëîæåíèÿ= ",Bid) ; } } break ; // òî æå ñàìîå äëÿ îðäåðà íà ïðîäàæó case 1: if ( aaa == -1 && MathAbs(Bid - open_price)< bbb) { ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,50,stopp_loss,teik_profit,0,magic,0,CLR_NONE); if (ticket == -1) Print("îøèáêà îòêðûòèÿ îðäåðà íà ïðîäàæó ",GetLastError()) ; break; } if(stopp_loss!=OrderStopLoss() && stopp_loss!=0.0 && MathAbs(Ask-OrderStopLoss()) > stop_level) { if (OrderModify(ticket,0,stopp_loss,0,0,CLR_NONE)== false) { Print ("îøèáêà ìîäèôèêàöèè ëèíèÿ 4 ",GetLastError()) ; Print("Âèðòóàëüíûé ñòîï ëîññ= ",stopp_loss," Ðåàëüíàÿ öåíà ñïðîñà= ",Bid) ; } } break ; case 2: //äëÿ îðäåðà Buy_Limit üîäèôèêàöèÿ åñëè èçìåíèëñÿ óðîâåíü îòêðûòèÿ öåíû äëÿ ëèìèòíèêîâ âñå îäèíàêîâîå if (aaa == -1) { OrderSend(Symbol(),OP_BUYLIMIT,Lot,open_price,0,stopp_loss,teik_profit,0,magic,0,CLR_NONE); Print("óñòàíàâëèâàåì BUYLIMIT") ; break ; } if (open_price != OrderOpenPrice() && MathAbs(Ask-OrderOpenPrice()) > stop_level) { if (OrderModify(ticket,open_price,stopp_loss,teik_profit,0,CLR_NONE)==false ) Print ("îøèáêà ìîäèôèêàöèè ëèíèÿ 5 ",GetLastError()) ; } break ; case 3: if (aaa == -1) { OrderSend(Symbol(),OP_SELLLIMIT,Lot,open_price,0,stopp_loss,teik_profit,0,magic,0,CLR_NONE); Print("óñòàíàâëèâàåì SELLLIMIT") ; break ; } if (open_price != OrderOpenPrice() && MathAbs(Bid-OrderOpenPrice()) > stop_level) { if (OrderModify(ticket,open_price,stopp_loss,teik_profit,0,CLR_NONE)==false ) Print ("îøèáêà ìîäèôèêàöèè ëèíèÿ 6 ",GetLastError()) ; } break ; case 4: if (aaa == -1) { OrderSend(Symbol(),OP_BUYSTOP,Lot,open_price,0,stopp_loss,teik_profit,0,magic,0,CLR_NONE); Print("óñòàíàâëèâàåì BUYSTOP") ; break ; } if (open_price != OrderOpenPrice() && MathAbs(Ask-OrderOpenPrice()) > stop_level) { if (OrderModify(ticket,open_price,stopp_loss,teik_profit,0,CLR_NONE)==false ) Print ("îøèáêà ìîäèôèêàöèè ëèíèÿ 7 ",GetLastError()) ; } break ; case 5: if (aaa == -1) { OrderSend(Symbol(),OP_SELLSTOP,Lot,open_price,0,stopp_loss,teik_profit,0,magic,0,CLR_NONE); Print("óñòàíàâëèâàåì SELLSTOP") ; break ; } if (open_price != OrderOpenPrice() && MathAbs(Bid-OrderOpenPrice()) > stop_level) { if (OrderModify(ticket,open_price,stopp_loss,teik_profit,0,CLR_NONE)==false ) Print ("îøèáêà ìîäèôèêàöèè ëèíèÿ 8 ",GetLastError()) ; } break ; } return(0) ; } //========================================================================================================= void Delete_Position_r(int index,int magic) { // Ôóíêöèÿ óäàëåíèÿ îðäåðîâ ðåàëüíûõ ïîçèöèé åñëè îðäåð îòëîæåííûé òî îí ïðîñòî óäàëÿåòñÿ // åñëè ñðàáîòàâøèé òî çàêðûâàåòñÿ ïî ðûíêó . int operation ; operation=Type_Order_r(magic) ; int pos ,ticket; int total=OrdersTotal(); for (pos=0;pos<total;pos++) { if(OrderMagicNumber() != magic) continue ;//âûáðàííûé îðäåð íå íàø ticket=OrderTicket(); break ; } if ( operation > 1) { OrderDelete(ticket) ; return(0) ; } if (operation == 0) { OrderClose(ticket,Lot,Bid,50,CLR_NONE) ; return(0) ; } if (operation ==1) { OrderClose(ticket,Lot,Ask,50,CLR_NONE) ; return(0) ; } return(0) ; }
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It can change open orders parameters, due to possible stepping strategy
It Closes Orders by itself
Other Features: