//+------------------------------------------------------------------+ //| FxDownloader 2006 | //| KENZO | //| | //+------------------------------------------------------------------+ //---- input parameters extern double Lots=1.0; extern int ReInvest=1; extern int ReadHistory=1; // ×òåíèå èñòîðèè (1) èëè ïåðåçàïèñü èñòîðèè (0) extern double Probab=0.8; // òðåáóåìàÿ âåðîÿòíîñòü âûèãðûøà extern int dstop=25; // øàã èçìåíåíèÿ ñòîïà â ïà÷êå ñòîïîâ extern int Nstop=1; // ÷èñëî ñòîïîâ â ïà÷êå ñòîïîâ ÍÅ ÁÎËÜØÅ 3 extern int delta=1; // øàã èçìåíåíèÿ øàãà â âåêòîðå extern int Nidelt=20; // ÷èñëî øàãîâ ïî èçìåíåíèþ øàãà â âåêòîðå ÍÅ ÁÎËÜØÅ 30 extern int NN=10; // ðàçìåð âåêòîðà ÍÅ ÁÎËÜØÅ 12 extern double forg=1.05; // ñêîðîñòü çàáûâàíèÿ ðåçóëüòàòîâ îáó÷åíèÿ extern bool ReplaceStops=true; extern double lTrailingStop =510; extern double sTrailingStop =510; extern string _Parameters_b_Lots="Ïàðàìåòðû ìîäóëÿ ðàñ÷¸òà ëîòà"; extern int LotsWayChoice =1; // Ñïîñîá âûáîðà ðàáî÷åãî ëîòà: // 0-ôèêñèðîâàííûé, // 1-ïðîöåíò îò äåïîçèòà, // 2-ôðàêöèîííî-ïðîïîðöèîíàëüíûé, // 3-ôðàêöèîííî-ôèêñèðîâàííûé, extern int LotsPercent =30; // Ïðîöåíò îò äåïîçèòà extern int LotsDeltaDepo =500; // Êîýôôèöèåíò ïðèðàùåíèÿ äåïîçèòà extern int LotsDepoForOne =500; // Ðàçìåð äåïîçèòà äëÿ îäíîãî ìèíèëîòà extern int LotsMax =10000; // Ìàêñèìàëüíîå êîëè÷åñòâî ëîòîâ //---- int mn,Ncomb,izm,ii,metka,file1,idelt,i,istop,Take0,Stop0,TrailingStop,total,ticket; int buy_open,sell_open,buy_close,sell_close,ik,nb,ns,iii,ReWriteHistory; double time0,prob,prob0,Balance0,lotsi,OpenPriceBuy,OpenPriceSell,LastBuyOpen,LastSellOpen; string FileName="sss"; int delt[30],sr[50,30],sd[5000,30,3],stop[3],nsd[5000,30,3]; double P[12,30],pt[30],cen[5000,30,3],rost[5000,30,3],spad[5000,30,3],LastSd[5000,30,3]; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init() { //íå î÷åíü õîðîøàÿ èíèöèàëèçàöèÿ. Íå ðåêîìåíäóåòñÿ ÷àñòî âûêëþ÷àòü ñèñòåìó for(idelt=1;idelt<=Nidelt;idelt++) { delt[idelt]=delta*idelt; for(i=1;i<=NN-1;i++){ P[i,idelt]=Close[i-1]; } } return(0);} //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int deinit() {return(0);} //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { double MidLot; // Çàùèòà îò áåñïëàòíîãî ðàñïðîñòðàíåíèÿ â Èíòåðíåò // if(iii==0){Alert("Äåìî-âåðñèÿ ïðîãðàììû ðàáîòàåò òîëüêî íà Òåñòåðå");iii=1;} // if(IsTesting()==false)return(0); buy_open=0;sell_open=0;buy_close=0;sell_close=0; //---- if(ReadHistory==0)ReWriteHistory=1; if(Bars<205||AccountFreeMargin()<10)return(0); for(idelt=1;idelt<=Nidelt;idelt++) { delt[idelt]=delta*idelt; //ôîðìèðîâàíèå âåêòîðîâ öåí ñ øàãîì delta*idelt if(MathAbs(Ask-P[1,idelt])>(delt[idelt]-0.5)*Point) { for(i=1;i<=NN-1;i++){ P[NN+1-i,idelt]=P[NN-i,idelt]; } P[1,idelt]=Ask; } //ïðè èçìåíåíèè âåêòîðà ïðîâîäèì îáðàáîòêó íîâîé èíôîðìàöèè if(MathAbs(P[1,idelt]-pt[idelt])>0.5*Point) { //ñòðîèì âåêòîð ïàðíûõ ñðàâíåíèé for(i=1;i<=NN-1;i++) { if(P[i,idelt]>P[i+1,idelt]){sr[i,idelt]=1;} else {sr[i,idelt]=0;} } //âû÷èñëÿåì íîìåð òåêóùåé êîìáèíàöèè Ncomb=0; mn=1; for(i=1;i<=NN-1;i++){ Ncomb=Ncomb+mn*sr[i,idelt]; mn=2*mn; } //îòêðûâàåì ôèêòèâíóþ ïîçèöèþ ñ ìåòêîé êîìáèíàöèè, åñëè òàêàÿ ïîçèöèÿ åùå íå îòêðûòà //îòêðûòèå ïðîâîäèì ïî âñåé ïà÷êå ñòîïîâ c ïîðîãîì ïî ÷àñòîòå ñäåëîê â êàæäîì êàíàëå for(istop=1;istop<=Nstop;istop++) { if(sd[Ncomb,idelt,istop]==0 && CurTime()-LastSd[Ncomb,idelt,istop]>2*Period()*60) { sd[Ncomb,idelt,istop]=1; cen[Ncomb,idelt,istop]=Ask; LastSd[Ncomb,idelt,istop]=CurTime(); } } //ïðîâåðÿåì âñå ïðåæíèå ôèêòèâíûå ïîçèöèè íà ïðåäìåò çàêðûòèÿ for(istop=1;istop<=Nstop;istop++){ stop[istop]=dstop*istop; for(i=0;i<=mn-1;i++) { if(sd[i,idelt,istop]==1) { if(Ask-cen[i,idelt,istop]>stop[istop]*Point) { rost[i,idelt,istop]=rost[i,idelt,istop]/forg+1; spad[i,idelt,istop]=spad[i,idelt,istop]/forg; sd[i,idelt,istop]=0; nsd[i,idelt,istop]=nsd[i,idelt,istop]+1; } if(cen[i,idelt,istop]-Ask>stop[istop]*Point) { spad[i,idelt,istop]=spad[i,idelt,istop]/forg+1; rost[i,idelt,istop]=rost[i,idelt,istop]/forg; sd[i,idelt,istop]=0; nsd[i,idelt,istop]=nsd[i,idelt,istop]+1; } } } } //äàåì ïðèêàç íà îòêðûòèå ðåàëüíîé ïîçèöèè, åñëè ñòàòèñòèêà òåêóùåé êîìáèíàöèè áëàãîïðèÿòíà for(istop=1;istop<=Nstop;istop++) { stop[istop]=dstop*istop; prob=rost[Ncomb,idelt,istop]/(rost[Ncomb,idelt,istop]+spad[Ncomb,idelt,istop]+0.0001); if(prob>Probab && nsd[Ncomb,idelt,istop]>10 && CurTime()-LastBuyOpen>2*Period()*60) { Take0=stop[istop]; Stop0=stop[istop]; buy_open=1; if(OrdersTotal()>0) {//çàêðûòèå ñèëüíûì ñèãíàëîì for(i=0;i<OrdersTotal();i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol()) { if(OrderType()==OP_SELL) { FileName="FDlast_sell"+Symbol()+Period(); file1=FileOpen(FileName,FILE_CSV|FILE_READ); prob0=FileReadNumber(file1); if(prob>(prob0+0.05))sell_close=1; FileClose(file1); } } } } FileName="FDlast_buy"+Symbol()+Period(); file1=FileOpen(FileName,FILE_CSV|FILE_WRITE); FileWrite(file1,prob); FileClose(file1); } //ôèêñàöèÿ ïðèáûëè ñëàáûì ñèãíàëîì if(OrdersTotal()>0) { for(i=0; i<OrdersTotal();i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol()) { if(OrderType()==OP_SELL) { if(prob>0.6 && nsd[Ncomb,idelt,istop]>10 && (OrderOpenPrice()-Ask)>(dstop/2)*Point) sell_close=1; } } } } prob=spad[Ncomb,idelt,istop]/(rost[Ncomb,idelt,istop]+spad[Ncomb,idelt,istop]+0.0001); if(prob>Probab && nsd[Ncomb,idelt,istop]>10 && CurTime()-LastSellOpen>2*Period()*60) { Take0=stop[istop]; Stop0=stop[istop]; sell_open=1; if(OrdersTotal()>0) { for(i=0;i<OrdersTotal();i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { FileName="FDlast_buy"+Symbol()+Period(); file1=FileOpen(FileName,FILE_CSV|FILE_READ); prob0=FileReadNumber(file1); if(prob>(prob0+0.05))buy_close=1; FileClose(file1); } } } } FileName="FDlast_sell"+Symbol()+Period(); file1=FileOpen(FileName,FILE_CSV|FILE_WRITE); FileWrite(file1,prob); FileClose(file1); } //ôèêñàöèÿ ïðèáûëè ñëàáûì ñèãíàëîì if(OrdersTotal()>0) { for(i=0;i<OrdersTotal();i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { if(prob>0.6 && nsd[Ncomb,idelt,istop]>10 && (Bid-OrderOpenPrice())>(dstop/2)*Point)buy_close=1; } } } } } izm=izm+1; } pt[idelt]=P[1,idelt]; } //Ñ÷èòûâàíèå èíôîðìàöèè èç ôàéëà if(ii==0) { FileName="FD_"+Symbol(); ii=1; file1=FileOpen(FileName,FILE_CSV|FILE_READ); metka=FileReadNumber(file1);time0=FileReadNumber(file1); if(metka==1 && ReadHistory==1 && ReWriteHistory!=1) { //*/ for(idelt=1;idelt<=Nidelt;idelt++){for(i=1;i<=NN;i++){ //*/ P[i,idelt]=FileReadNumber(file1); } } for(istop=1;istop<=Nstop;istop++) { for(idelt=1;idelt<=Nidelt;idelt++) { for(i=0;i<=mn-1;i++) { rost[i,idelt,istop]=FileReadNumber(file1); spad[i,idelt,istop]=FileReadNumber(file1); nsd[i,idelt,istop]=FileReadNumber(file1); } } } } FileClose(file1); } //Çàïèñü èíôîðìàöèè â ôàéë ÷åðåç 100 èçìåíåíèé âåêòîðà //Âîçìîæíîñòü íàêðóòêè ñòàòèñòèêè ïðè ÷àñòîì òåñòèðîâàíèè èñêëþ÷åíà if(izm>10 && (CurTime()>=time0 || ReWriteHistory==1)) { izm=0; FileName="FD_"+Symbol(); file1=FileOpen(FileName,FILE_CSV|FILE_WRITE); FileWrite(file1,"1");FileWrite(file1,CurTime()); //*/ for(idelt=1;idelt<=Nidelt;idelt++){for(i=1;i<=NN;i++){ //*/ FileWrite(file1,P[i,idelt]); } } for(istop=1;istop<=Nstop;istop++) { for(idelt=1;idelt<=Nidelt;idelt++) { for(i=0;i<=mn-1;i++) { FileWrite(file1,rost[i,idelt,istop]); FileWrite(file1,spad[i,idelt,istop]); FileWrite(file1,nsd[i,idelt,istop]); } } } FileClose(file1); } //ÁËÎÊ ÈÑÏÎËÍÅÍÈß ÏÐÈÊÀÇΠif(ik==0){Balance0=AccountBalance();ik=1;} if(ReInvest==1)lotsi=Lots*AccountBalance()/Balance0; else lotsi=Lots; if(lotsi<0.1){lotsi=0.1;} if(lotsi>=0.1 && lotsi<0.2)lotsi=0.1; else { if(lotsi>=0.2 && lotsi<0.5)lotsi=0.2; else { if(lotsi>=0.5 && lotsi<1)lotsi=0.5; else { if(lotsi>=1 && lotsi<2)lotsi=1; else { if(lotsi>=2 && lotsi<3)lotsi=2; else { if(lotsi>=3 && lotsi<4)lotsi=3; else { if(lotsi>=4 && lotsi<5)lotsi=4; else { if(lotsi>=5 && lotsi<6)lotsi=5; else { if(lotsi>=6 && lotsi<7)lotsi=6; else { if(lotsi>=7 && lotsi<8)lotsi=7; else { if(lotsi>=8 && lotsi<9)lotsi=8; else { if(lotsi>=9 && lotsi<15)lotsi=9; else { if(lotsi>=15 && lotsi<20)lotsi=15; else { if(lotsi>=20 && lotsi<25)lotsi=20; else { if(lotsi>=25 && lotsi<30)lotsi=25; else { if(lotsi>=30 && lotsi<35)lotsi=30; else { if(lotsi>=35 && lotsi<40)lotsi=35; else { if(lotsi>=40 && lotsi<45)lotsi=40; else { if(lotsi>=45 && lotsi<50)lotsi=45; else { if(lotsi>=50 && lotsi<55)lotsi=50; else { if(lotsi>=55 && lotsi<60)lotsi=55; else { if(lotsi>=60 && lotsi<65)lotsi=60; else { if(lotsi>=65 && lotsi<70)lotsi=65; else { if(lotsi>=70 && lotsi<75)lotsi=70; else { if(lotsi>=75 && lotsi<80)lotsi=75; else { if(lotsi>=80 && lotsi<85)lotsi=80; else { if(lotsi>=85 && lotsi<90)lotsi=85; else { if(lotsi>=90 && lotsi<95)lotsi=90; else { if(lotsi>=95 && lotsi<100)lotsi=95; else { if(lotsi>=100)lotsi=lotsi;/*100*/ } } } } } } } } } } } } } } } } } } } } } } } } } } } } } MidLot=GetSizeLot(); lotsi=NormalizeDouble(MidLot,1); total=OrdersTotal(); //èñïîëíÿåì ïðèêàçû íà îòêðûòèå if(total==0) { if(buy_open==1 && MathAbs(OpenPriceBuy-Ask)>10*Point) { Print("Trying to open BUY price: ",Ask," Stop ",Ask-Stop0*Point," TP ",Point,Ask+(Take0*Point)); ticket=OrderSend(Symbol(),OP_BUY,lotsi,Ask,3,Ask-Stop0*Point,Ask+Take0*Point,"AT",16384,0,Blue); return(0); } if(sell_open==1 && MathAbs(OpenPriceSell-Bid)>10*Point) { Print("Trying to open SELL price: ",Bid," Stop ",Bid+Stop0*Point," TP ",Bid-Take0*Point); ticket=OrderSend(Symbol(),OP_SELL,lotsi,Bid,3,Bid+Stop0*Point,Bid-Take0*Point,"AT",16384,0,Red); return(0); } } if(total==1) { OrderSelect(0, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol()) { if(OrderType()==OP_SELL) { if(buy_open==1 && MathAbs(OpenPriceSell-Bid)>10*Point) { ticket=OrderSend(Symbol(),OP_BUY,lotsi,Ask,3,Ask-Stop0*Point,Ask+Take0*Point,"AT",16384,0,Orange); return(0); } } if(OrderType()==OP_BUY) { if(sell_open==1 && MathAbs(OpenPriceBuy-Ask)>10*Point) { ticket=OrderSend(Symbol(),OP_SELL,lotsi,Bid,3,Bid+Stop0*Point,Bid-Take0*Point,"AT",16384,0,Red); return(0); } } } } //ñìåùåíèå ñòîïîâ ïðè ïîâòîðíûõ ïðèêàçàõ íà îòêðûòèå ïîçèöèè òîãî æå òèïà if(total>0) { for(i=0;i<total;i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY && buy_open==1 && Bid-OrderStopLoss()>Stop0*Point) { OrderModify(OrderTicket(),OrderOpenPrice(), Bid-Stop0*Point,Bid+Take0*Point,0,Orange); return(0); } if(OrderType()==OP_SELL && sell_open==1 && OrderStopLoss()-Ask>Stop0*Point) { OrderModify(OrderTicket(),OrderOpenPrice(), Ask+Stop0*Point*TrailingStop,Ask-Take0*Point,0,Red); return(0); } } } } //ñíèìàåì ïðèêàçû íà îòêðûòèå, åñëè íóæíûå ïîçèöèè óæå îòêðûòû if(total>0) { for(i=0;i<total;i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY){buy_open=0; LastBuyOpen=CurTime(); OpenPriceBuy=OrderOpenPrice(); } if(OrderType()==OP_SELL){sell_open=0; LastSellOpen=CurTime(); OpenPriceSell=OrderOpenPrice(); } } } } //èñïîëíÿåì ïðèêàçû íà çàêðûòèå if(total>0) { for(i=0;i<total;i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol()) { if(buy_close==1 && OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Orange); return(0); } if(sell_close==1 && OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return(0); } } } } //ñíèìàåì ïðèêàçû íà çàêðûòèå, åñëè íóæíûå ïîçèöèè óæå çàêðûòû nb=0;ns=0; if(total>0) { for(i=0;i<total;i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY)nb=1; if(OrderType()==OP_SELL)ns=1; } } } if(nb==0)buy_close=0; if(ns==0)sell_close=0; //ÄÂÈÆÅÍÈÅ ÑÒÎÏΠif(OrdersTotal()>0) { for(i=0;i<OrdersTotal();i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { if(TrailingStop>10) { if(OrderStopLoss()<Bid-Point*TrailingStop) OrderModify(OrderTicket(),OrderOpenPrice(), Bid-Point*TrailingStop,Bid+Point*TrailingStop,0,Orange); } } if(OrderType()==OP_SELL) { if(TrailingStop>10) { if(OrderStopLoss()>Ask+Point*TrailingStop) OrderModify(OrderTicket(),OrderOpenPrice(), Ask+Point*TrailingStop,Ask-Point*TrailingStop,0,Red); } } } } } //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double GetSizeLot() { double dLot; if (LotsWayChoice==0) dLot=lotsi; // ôèêñèðîâàííûé ïðîöåíò îò äåïîçèòà if (LotsWayChoice==1) { dLot=MathCeil(AccountFreeMargin()/10000*LotsPercent)/10; } // ôðàêöèîííî-ïðîïîðöèîíàëüíûé if (LotsWayChoice==2) { int k=LotsDepoForOne; for(double i=2; i<=LotsMax; i++) { k=k+i*LotsDeltaDepo; if (k>AccountFreeMargin()) { dLot=(i-1)/10; break; } } } // ôðàêöèîííî-ôèêñèðîâàííûé if (LotsWayChoice==3) { dLot=MathCeil((AccountFreeMargin()-LotsDepoForOne)/LotsDeltaDepo)/10; } if (dLot<0.1) dLot=0.1; if (dLot>LotsMax) dLot=LotsMax; //---- return(dLot); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
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:
Uses files from the file system
It reads information from a file
It writes information to file