//+----------------------------------------------------------------------------+ //| Àâòîð : Áîðèñ Ñåäîâ | //| E-mail : boris-sedov@yandex.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 23.12.2008 | //| Îïèñàíèå : Ìàòðèöà, äëÿ ìîäåëèðîâàíèÿ âèðòóàëüíûõ ÒÑ, à òàêæå äëÿ ñîçäàíèÿ| //| àâòîíîìíûõ îïòèìèçàòîðîâ ýêñïåðòîâ ëþáîé ñëîæíîñòè. | //+----------------------------------------------------------------------------+ #property copyright "Copyright © 2009, Boris Sedov ( boris-sedov@yandex.ru )." #property link "boris-sedov@yandex.ru" //----- Âêëþ÷åíèå, âûêëþ÷åíèå âèçóàëèçàöèè âèðòóàëüíîé òîðãîâëè (âûâîä íà ãðàôèê â æóðíàë è â ôàéë HTML-îò÷åò) âêë. TRUE âûêë. FALSE extern bool Visualization=TRUE; //- Åñëè âêëþ÷åí òîëüêî Visualization=TRUE; òî âûâîä áóäåò òîëüêî íà ãðàôèê. //----- Âêëþ÷åíèå, âûêëþ÷åíèå âûâîäà â æóðíàë) âêë. TRUE âûêë. FALSE. !!! Òîëüêî ïðè âêëþ÷åííîì Visualization=TRUE; extern bool Jurnal_Print=TRUE; //----- Âêëþ÷åíèå, âûêëþ÷åíèå âûâîäà â ôàéë HTML-îò÷åò) âêë. TRUE âûêë. FALSE !!! Òîëüêî ïðè âêëþ÷åííîì Visualization=TRUE; extern bool File_Print=TRUE; //- HTML-îò÷åò ñäåñü - êàòàëîã_òåðìèíàëà\experts\files èëè (êàòàëîã_òåðìèíàëà\tester\files) - Virtual_trade.html //----- Âêë., Âûêë. ñîâìåñòíîé ðàáîòû âñåõ ñèñòåì. Åñëè TRUE òî êàæäàÿ ÒÑ âèäèò ÷óæèå îðäåðà è ìîæåò âûïîëíÿòü ñ íèìè ëþáûå òîðãîâûå äåéñòâèÿ //----- è âñå ÒÑ ðàáîòàþò ñ îäíèì áàëàíñîì, à òàêæå â æóðíàëå è â ôàéëå âñå îïåðàöèè ïðîõîäÿò ñ ïðåôèêñîì "0". //----- Åñëè FALSE òî êàæäàÿ ÒÑ âèäèò òîëüêî ñâîè îðäåðà, è ðàáîòàåò ñî ñâîèì îòäåëüíûì áàëàíñîì. extern bool TS_Friendship=FALSE; //----- Îáùåå êîëè÷åñòâî èñïîëüçóåìûõ ìîäåëåé ÒÑ îò 1 äî ~ Äàæå åñëè èñïîëüçóåòñÿ òîëüêî îäíà âñå ðàâíî íóæíî óêàçàòü îáùåå êîëè÷åñòâî ÒÑ extern int TS_SUM=3; //---- Ìàêñèìàëüíîå îáùåå êîëè÷åñòâî îòêðûòûõ è îòëîæåííûõ îðäåðîâ, ðàçðåøîííîå áðîêåðîì extern int MAX_Orders=0; /* Åñëè çàïóñòèòü ýòó ïðîãó íà äåìî, íà ðåàëå èëè íà òåñòåðå îíà áóäåò âåñòè âèðòóàëüíóþ òîðãîâëþ ïî çàëîæåííûì â íå¸ òîðãîâûì ñòðàòåãèÿì. Î ïðèêëàäíîì èñïîëüçîâàíèè ýòîé ñèñòåìû íàïèñàíî â âåòêå "Èñêóñòâåííûé èíòåëëåêò" - http://forum.alpari.ru/thread44003.html Âíèìàíèå!!! Âñå òåñòû ïðîâîäèòü èëè ïî âñåì òèêàì èëè ïî êîíòðîëüíûì òî÷êàì íî íå ïî öåíàì îòêðûòèÿ. Ïåðåèìåíóéòå íàçâàíèÿ âñåõ óêàçàííûõ ôóíêöèé âñòàâëÿåìîãî ýêñïåðòà â íàçâàíèÿ èõ âèðòóàëüíûõ êîïèé. Íèæå ïåðå÷èñëåíû âñå ýòè ôóíêöèè. GetLastError_v - GetLastError OrderSend_v - OrderSend OrderClose_v - OrderClose OrderCloseBy_v - OrderCloseBy OrderDelete_v - OrderDelete OrderModify_v - OrderModify OrderSelect_v - OrderSelect Ïðèìåð: Áûëî - OrderSend(Symbol(),OP_BUY,Obyem,Ask,3,price_los,0,0,MagicNumbers,0,Blue); Ñòàëî - OrderSend_v(Symbol(),OP_BUY,Obyem,Ask,3,price_los,0,0,MagicNumbers,0,Blue); Âî âñåõ ôóíêöèÿõ ìîæíî ïðîïóñêàòü ïîñëåäíèé ïàðàìåòð â äàííîì ñëó÷àå ìîæíî íå óêàçûâàòü öâåò ! òîãäà áóäåò òàê - OrderSend_v(Symbol(),OP_BUY,Obyem,Ask,3,price_los,0,0,MagicNumbers,0); Ñëåäóþùèå ôóíêöèè ïåðåèìåíóéòå â ìàññèâû. OrdersTotal_v[TS_number] - OrdersTotal() OrdersHistoryTotal_v[TS_number] - OrdersHistoryTotal() AccountBalance_v[TS_number] - AccountBalance() Ïðèìåð: Áûëî - OrdersTotal() Ñòàëî - OrdersTotal_v[TS_number] À ñëåäóþùèå ôóíêöèè íóæíî ïåðåèìåíîâàòü â ïåðåìåííûå OrderTicket_v - OrderTicket() OrderSymbol_v - OrderSymbol() OrderType_v - OrderType() OrderLots_v - OrderLots() OrderComment_v - OrderComment() OrderMagicNumber_v - OrderMagicNumber() OrderOpenTime_v - OrderOpenTime() OrderOpenPrice_v - OrderOpenPrice() OrderStopLoss_v - OrderStopLoss() OrderTakeProfit_v - OrderTakeProfit() OrderCloseTime_v - OrderCloseTime() OrderClosePrice_v - OrderClosePrice() OrderProfit_v - OrderProfit_v() OrderCommission_v - OrderCommission() OrderExpiration_v - OrderExpiration() OrderPrint_v - OrderPrint() OrderSwap_v - OrderSwap() Ïðèìåð: Áûëî - OrderTicket(); Ñòàëî - OrderTicket_v; Åñëè â ýêñïåðòå èñïîëüçóþòñÿ ôóíêöèè init() è deinit() òî èõ ñëåäóåò òàêæå ïåðåèìåíîâàòü â init_v() è deinit_v() è âûçûâàòü èç ðåàëüíûõ ôóíêöèé init() è deinit(), ýòî äëÿ òîãî ÷òîáû óïðîñòèòü ìîäåëèðîâàíèå ïðè íàëè÷èè â ìàòðèöå ñðàçó íåñêîëüêèõ âèðòóàëüíûõ ìîäåëåé êàêèõ òî ýêñïåðòîâ ñ ðàçíûìè ôóíêöèÿìè init_v() è deinit_v(). Ìîæíî ïðèñâîèòü êàæäîé ôóíêöèè ïðåôèêñ ïðèíàäëåæíîñòè ê òîé èëè èíîé òîðãîâîé ìîäåëè. Íàïðèìåð: init_BAS_Trader() è ò. ä. Ýòî óäîáíî åùå òåì ÷òî âñå ïåðåìåííûå îáúÿâëåííûå â ïîëó÷åííûõ init_v() è deinit_v() íå êîíôëèêòóþò ïðè ñîâïàäåíèè èìåí òàê êàê îíè ëîêàëüíû. Òàêæå ñëåäóåò ïîñòóïèòü è ñ ôóíêöèåé start(), òî åñòü ïåðåèìåíîâàòü å¸, à çà òåì âûçûâàòü èç ðåàëüíîé start(). Âñå ýòî ÿ ïðîäåìîíñòðèðîâàë íèæå. */ //-------------------------------------------------------------------------------------------------------------------- //---- Ãëîáàëüíûå ïåðåìåííûå ìîäóëÿ AI int a; double s; bool TS1,TS2,TS1_v,TS2_v,TS3_v; string f; datetime g; color h; //-------------------------- //---- Ãëîáàëüíûå ïåðåìåííûå Ìîäóëÿ TS1 ïåðâîé òîðãîâîé ñèñòåìû //-------------------------- //---- Ãëîáàëüíûå ïåðåìåííûå ìàòðèöè int ticket_vs,ticket_v1[1000],ticket_v2[1000],OrderType_v1[1000],OrderType_v2[1000],magic_v1[1000],magic_v2[1000],POS_v1,POS_v2,POS_Svobodn[1000],POS_Svob,Vsego_POS_Svob,last_error_v,TS_num[1000]; double volume_v1[1000],volume_v2[1000],OrderOpenPrice_v1[1000],OrderOpenPrice_v2[1000],stoploss_v1[1000],stoploss_v2[1000],takeprofit_v1[1000],takeprofit_v2[1000],OrderClosePrice_v2[1000],OrderProfit_v1[1000],OrderProfit_v2[1000]; bool q3434; string symbol_v1[1000],symbol_v2[1000],comment_v1[1000],comment_v2[1000],Visual_Loss[1000],Visual_Profit[1000],Visual_Open[1000]; datetime OrderOpenTime_v1[1000],OrderOpenTime_v2[1000],OrderCloseTime_v2[1000],expiration_v1[1000]; color Color_v1[1000]; int OrderTicket_v; string OrderSymbol_v; int OrderType_v; double OrderLots_v; string OrderComment_v; int OrderMagicNumber_v; datetime OrderOpenTime_v; double OrderOpenPrice_v; double OrderStopLoss_v; double OrderTakeProfit_v; datetime OrderCloseTime_v; double OrderClosePrice_v; double OrderProfit_v; double OrderCommission_v; datetime OrderExpiration_v; string OrderPrint_v; double OrderSwap_v; int POS_slkt,TS_number; double AccountBalance_v[10000]; int OrdersTotal_v[10000]; int OrdersHistoryTotal_v[10000]; bool Work=true; bool File_POS=true; int File_POS_num=1; //---------------------------------------------------------------------------------------------------------------------- //------------- BAS-Trader_v2.50 ------- èëè äðóãîé ýêñïåðò ëþáîé ñëîæíîñòè -------------------------------------------- //+----------------------------------------------------------------------------+ //| Àâòîð : Áîðèñ Ñåäîâ | //| E-mail : boris-sedov@yandex.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 20.12.2008 | //| Îïèñàíèå : Ðàáîòà ïî ñèãíàëàì äâóõ MA. | //+----------------------------------------------------------------------------+ //---- Ââîä ïåðåìåííûõ //---- //---- Ïåðâîíà÷àëüíûé îáúåì double Obyem=0.1; //---- MagicNumber, îïîçíàâàòåëüíûé íîìåð, äëÿ îïðåäåëåíèÿ îðäåðîâ ñâîé-÷óæîé int MagicNumbers=141208; //---- Ïåðèîäû MA extern int Per_ma1=8; extern int Per_ma2=19; //---- Øèðèíà Ðàçáåãà 18 extern int Shyrina_r=18; //---- Ðàçìåð ÑÒÎÏΠâ ïóíêòàõ extern int StopLos=1010; //---- Ðàçìåð Òðåéëèíã Ñòîïîâ â ïóíêòàõ 170 extern int TrailingStop=860; //---- Ðàçìåð Ïðîôèòà â ïóíêòàõ extern int Profit=1090; //---- Êîýôôèöèåíò, õàðàêòåðèçóåò îòíîøåíèå îáåìà ê áàëàíñó extern double Koefficient1=0.633; //---- Ìîäóëü óïðàâëåíèÿ ýêñïåðòîì //---- Âêëþ÷åíèå-âûêëþ÷åíèå ðàáîòû ñ îáúåìàìè: âêë.-TRUE âûêë.-FALSE bool Obyemy_X=TRUE; //---------------------------------- //---- Äðóãèå ïåðåìåííûå int a1=10,modul=1,stepen=1,New_order_isp,New_order_otl,Ticket,Modul_otl,Modul_isp,Modul_new,Ticket_otl,Ticket_isp,Stepen_otl,Stepen_isp,Stepen_new,Napr_otl,Napr_isp,Napr_new,Udal_otl,N_Line,prib=1; int Stopy_new=12,Nepreryvnye,Trend,ticket,ticket2; double Lots,Lots_otl,price_new,Asks,Startovyi_balans,Startovyi_Obyem,Obyem_raschetn,LOTSTEP; datetime OrderCloseTimes; string N_Line_Str,Str_Trend; bool Razbeg=FALSE,Pervyi_proxod=TRUE; int vvv,P_Order,P_Trend=100; int Los_Buy=0,Normaling; int Los_Sell=0; //-Åùå îäèí ïðîñòåíüêèé ýêñïåðòèê äëÿ ïðèìåðà. Âíèìàíèå!!! âî âðåìÿ êîìïèëÿöèè âîçìîæíû îøèáêè èç çà ñîâïàäåíèÿ èìåí ãëîáàëüíûõ ïåðåìåííûõ //-- Ãëîáàëüíûå ïàðàìåòðû int ticket3; bool start_new=true; string order_pr; bool Start_Close_Delete=FALSE; //---------------------------------------------------------------------------------------------------------------------- //- À òåïåðü ïîñ÷èòàåì â óìå. //+------------------------------------------------------------------+ //| Ôóíêöèÿ èíèöèàëèçàöèè ìàòðèöè | //+------------------------------------------------------------------+ int init() { //---- for(int cicl=0; cicl<=TS_SUM; cicl++)AccountBalance_v[cicl]=AccountBalance(); //- Ââîä ïåðâîíà÷àëüíîãî áàëàíñà if(Visualization) { if(File_Print) { int handle; handle=FileOpen("Virtual_trade.html", FILE_CSV | FILE_WRITE, ' '); if(handle>0) { FileSeek(handle, 0, SEEK_END); FileWrite(handle,"<HTML>"); FileWrite(handle,"<HEAD>"); FileWrite(handle,"<META HTTP-EQUIV=\"Content-Type\""); FileWrite(handle,"CONTENT=\"text/html; CHARSET=Windows-1251\">"); FileWrite(handle,"<TITLE>Ðåçóëüòàòû</TITLE>"); FileWrite(handle,"</HEAD>"); FileWrite(handle,"<BODY>"); FileWrite(handle,"<div align=center>"); FileWrite(handle,"<br><H2>Îò÷åò çà ",TimeToStr(TimeLocal(),TIME_DATE|TIME_MINUTES),"</H2><br>"); FileWrite(handle,"<table width=100% cellspacing=1 cellpadding=3 border=0>"); FileWrite(handle," "); FileWrite(handle,"<tr bgcolor=\"#C0C0C0\" align=right><td>¹</td><td>¹ ÒÑ</td><td>Âðåìÿ</td><td>Òèï</td><td>Îðäåð</td><td>Îáúåì</td><td>Ñèìâîë</td><td>Öåíà</td><td>S / L</td><td>T / P</td><td>Ïðèáûëü</td><td>Áàëàíñ</td></tr>"); FileClose(handle); } } } //---- return(0); } //+------------------------------------------------------------------+ //| Ôóíêöèÿ äå èíèöèàëèçàöèè ìàòðèöè | //+------------------------------------------------------------------+ int deinit() { //---- int cikl5; if(Visualization) { if(File_Print) { int handle; handle=FileOpen("Virtual_trade.html", FILE_CSV | FILE_READ | FILE_WRITE, ' '); if(handle>0) { FileSeek(handle, 0, SEEK_END); FileWrite(handle," "); FileWrite(handle,"</table></div></BODY></HTML>"); FileClose(handle); } } if(TS_Friendship==FALSE) { OrdersTotal_v[0]=0; for(int cicl=1; cicl<=TS_SUM; cicl++) OrdersTotal_v[0]+=OrdersTotal_v[cicl]; } for(cikl5=0;cikl5<1000;cikl5++) { if(OrdersTotal_v[0]==0 || cikl5==POS_v1) break; if(ticket_v1[cikl5]==0) continue; ObjectDelete(Visual_Loss[cikl5]); ObjectDelete(Visual_Profit[cikl5]); ObjectDelete(Visual_Open[cikl5]); } WindowRedraw(); if(Jurnal_Print) { if(!TS_Friendship) for(cicl=1; cicl<=TS_SUM; cicl++)Print("AccountBalance_v ÒÑ-",cicl," = ",AccountBalance_v[cicl]); else Print("AccountBalance_v ÒÑ-",0," = ",AccountBalance_v[cicl]); } } //---- return(0); } //+------------------------------------------------------------------+ //| Ôóíêöèÿ start() ìàòðèöè | //+------------------------------------------------------------------+ int start() { //---- //---- Ìîäóëü ñîïðîâîæäåíèÿ îðäåðîâ "Ðàáîòà ñåðâåðà" ----------------------------------------------- //---- Ëîêàëüíûå ïåðåìåííûå int cikl1,cikl2,POS_v3; string Name_Close,Name_Close_Line; color Color; //-------------------------- if(TS_Friendship==FALSE) { OrdersTotal_v[0]=0; for(int cicl=1; cicl<=TS_SUM; cicl++) OrdersTotal_v[0]+=OrdersTotal_v[cicl]; } for(cikl1=0;cikl1<1000;cikl1++) { if(OrdersTotal_v[0]==0 || cikl1==POS_v1) break; if(ticket_v1[cikl1]==0) continue; if(OrderType_v1[cikl1]==0) { if(Bid<=stoploss_v1[cikl1] && stoploss_v1[cikl1]!=0) { OrderClosePrice_v2[POS_v2]=stoploss_v1[cikl1]; OrderProfit_v2[POS_v2]=OrderProfit_Raschet(OrderType_v1[cikl1], symbol_v1[cikl1], volume_v1[cikl1], OrderOpenPrice_v1[cikl1], OrderClosePrice_v2[POS_v2]); loss_profit( cikl1, Color_v1[cikl1], "stop loss #" ); continue; } if(Bid>=takeprofit_v1[cikl1] && takeprofit_v1[cikl1]!=0) { OrderClosePrice_v2[POS_v2]=takeprofit_v1[cikl1]; OrderProfit_v2[POS_v2]=OrderProfit_Raschet(OrderType_v1[cikl1], symbol_v1[cikl1], volume_v1[cikl1], OrderOpenPrice_v1[cikl1], OrderClosePrice_v2[POS_v2]); loss_profit( cikl1, Color_v1[cikl1], "take profit #" ); continue; } OrderProfit_v1[cikl1]=OrderProfit_Raschet(OrderType_v1[cikl1], symbol_v1[cikl1], volume_v1[cikl1], OrderOpenPrice_v1[cikl1], Bid); } if(OrderType_v1[cikl1]==1) { if(Ask>=stoploss_v1[cikl1] && stoploss_v1[cikl1]!=0) { OrderClosePrice_v2[POS_v2]=stoploss_v1[cikl1]; OrderProfit_v2[POS_v2]=OrderProfit_Raschet(OrderType_v1[cikl1], symbol_v1[cikl1], volume_v1[cikl1], OrderOpenPrice_v1[cikl1], OrderClosePrice_v2[POS_v2]); loss_profit( cikl1, Color_v1[cikl1], "stop loss #" ); continue; } if(Ask<=takeprofit_v1[cikl1] && takeprofit_v1[cikl1]!=0) { OrderClosePrice_v2[POS_v2]=takeprofit_v1[cikl1]; OrderProfit_v2[POS_v2]=OrderProfit_Raschet(OrderType_v1[cikl1], symbol_v1[cikl1], volume_v1[cikl1], OrderOpenPrice_v1[cikl1], OrderClosePrice_v2[POS_v2]); loss_profit( cikl1, Color_v1[cikl1], "take profit #" ); continue; } OrderProfit_v1[cikl1]=OrderProfit_Raschet(OrderType_v1[cikl1], symbol_v1[cikl1], volume_v1[cikl1], OrderOpenPrice_v1[cikl1], Ask); } if(OrderType_v1[cikl1]>1 && expiration_v1[cikl1]<=TimeCurrent() && expiration_v1[cikl1]>0) { OrderDelete_v(ticket_v1[cikl1],Black,TS_num[cikl1]); continue; } if(OrderType_v1[cikl1]==2) { if(Ask<=OrderOpenPrice_v1[cikl1]) { Open_otl_order( cikl1, 0, Color_v1[cikl1], ", buy " ); continue; } } if(OrderType_v1[cikl1]==3) { if(Bid>=OrderOpenPrice_v1[cikl1]) { Open_otl_order( cikl1, 1, Color_v1[cikl1], ", sell " ); continue; } } if(OrderType_v1[cikl1]==4) { if(Ask>=OrderOpenPrice_v1[cikl1]) { Open_otl_order( cikl1, 0, Color_v1[cikl1], ", buy " ); continue; } } if(OrderType_v1[cikl1]==5) { if(Bid<=OrderOpenPrice_v1[cikl1]) { Open_otl_order( cikl1, 1, Color_v1[cikl1], ", sell " ); continue; } } } if(Visualization) { if(Vsego_POS_Svob>0) { cikl1=POS_Svob; while(true) { if(cikl2==Vsego_POS_Svob) break; cikl2++; if(cikl1==0) cikl1=999; else cikl1--; POS_v3=POS_Svobodn[cikl1]; ObjectDelete(Visual_Loss[POS_v3]); ObjectDelete(Visual_Profit[POS_v3]); ObjectDelete(Visual_Open[POS_v3]); } } WindowRedraw(); } //-------------------------------------------------------------------------------------------------- RefreshRates(); //---- Ìîäóëü AI, ìîçã íàøåãî ðîáîòà ------------------------------------------------------------ //--- Çäåñü âñå åãî òåëî //---- Ëîêàëüíûå ïåðåìåííûå int a11; double s11; bool p11; string f11; datetime g11; color h11; //- Óïðàâëåíèå Òîðãîâûìè ñòðàòåãèÿìè TS1=FALSE; TS2=FALSE; TS1_v=TRUE; //- âêë., âûêë. ÒÑ TS2_v=FALSE; //- âêë., âûêë. ÒÑ TS3_v=FALSE; //- À ýòî ÒÑ äëÿ ïðîâåðêè è äåìîíñòðàöèè ðàáîòû â ðàçíûõ ðåæèìàõ "TS_Friendship", ÷åðåç íåêîòîðîå âðåìÿ //- ïîñëå çàïóñêà ïûòàåòñÿ çàêðûâàòü è óäàëÿòü âñå â ïîäðÿä îðäåðà. //----------------------------------------------------------------------------------------------------------------- if(TS1==TRUE) { } //---------------------------------- if(TS2==TRUE) { } //---------------------------------- è òàê äàëåå //-------------------------------------------------------------------------------------------------- //---- Çäåñü áóäåò âûçâàí âèðòóàëüíûé àíàëîã ïåðâîé ÒÑ ----------- if(TS1_v==TRUE) { if(TS_Friendship==FALSE) TS_number=1; //- Ïîðÿäêîâûé íîìåð ÒÑ. îò 1 äî ~ BAS_Trader(); } //------------------------------------------------- //---- Çäåñü áóäåò âûçâàí âèðòóàëüíûé àíàëîã âòîðîé ÒÑ ----------- if(TS2_v==TRUE) { if(TS_Friendship==FALSE) TS_number=2; //- Ïîðÿäêîâûé íîìåð ÒÑ. îò 1 äî ~ Sar_System(); } //------------------------------------------------- //---- Çäåñü áóäåò âûçâàí âèðòóàëüíûé àíàëîã òðåòüåé ÒÑ ----------- if(TS3_v==TRUE) { if(TS_Friendship==FALSE) TS_number=3; //- Ïîðÿäêîâûé íîìåð ÒÑ. îò 1 äî ~ Zakryvalka_Udolyalka(); } //------------------------------------------------- //---- è ò. ä. return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Âèðòóàëüíàÿ ÒÑ BAS-Trader | //+------------------------------------------------------------------+ int BAS_Trader() { int total,cikl1,Magic,Typ,Napr,Prosadka,cmd,Per_ma_Max; double Lots_r,price_Buy_los,price_Sell_los,price_los,price_prof,OrderProfits,OrderLos,price; color colors; double MA1,MA2; bool Ans=false,BUY_new=FALSE,SELL_new=FALSE; //-------------------------------------------------------------- //---- Ïðåäâàðèò.îáðàáîòêà if(Per_ma1>Per_ma2) Per_ma_Max=Per_ma1; else Per_ma_Max=Per_ma2; if(Bars < Per_ma_Max) // Íåäîñòàòî÷íî áàðîâ { Alert("Íåäîñòàòî÷íî áàðîâ â îêíå. Ýêñïåðò íå ðàáîòàåò."); return; // Âûõîä èç start() } if(Work==false) // Êðèòè÷åñêàÿ îøèáêà { Alert("Êðèòè÷åñêàÿ îøèáêà. Ýêñïåðò íå ðàáîòàåò."); return; // Âûõîä èç start() } //--------------------------------------------------------------- //---- Ðàáîòà ñ îáúåìàìè----------------------------------- if(Obyemy_X==TRUE) { LOTSTEP=MarketInfo(Symbol(),MODE_LOTSTEP); if(LOTSTEP<1 && LOTSTEP>0.0999) Normaling=1; if(LOTSTEP<0.1 && LOTSTEP>0.0099) Normaling=2; if(LOTSTEP<0.01 && LOTSTEP>0.0009) Normaling=3; Obyem_raschetn=(AccountEquity()/10000)*Koefficient1; Obyem=NormalizeDouble(Obyem_raschetn,Normaling); if(Obyem<MarketInfo(Symbol(),MODE_MINLOT)) { Obyem_raschetn=MarketInfo(Symbol(),MODE_MINLOT); Obyem=NormalizeDouble(Obyem_raschetn,Normaling); } if(Obyem>MarketInfo(Symbol(),MODE_MAXLOT)) { Obyem_raschetn=MarketInfo(Symbol(),MODE_MAXLOT); Obyem=NormalizeDouble(Obyem_raschetn,Normaling); } } //--------------------------------------------------------- //---- Îïðåäåëÿåì òðåíä------------------------------- HideTestIndicators(true); MA1 = iMA(NULL,0,Per_ma1,0,MODE_SMA,PRICE_MEDIAN,0); MA2 = iMA(NULL,0,Per_ma2,0,MODE_SMA,PRICE_MEDIAN,0); HideTestIndicators(false); if(MA1>MA2+Shyrina_r*Point || MA1<MA2-Shyrina_r*Point) Razbeg=TRUE; if(MA1>MA2 && Razbeg==FALSE) { Trend=0; Razbeg=FALSE; } if(MA1<MA2 && Razbeg==FALSE) { Trend=0; Razbeg=FALSE; } if(MA1>MA2 && Razbeg==TRUE) { Trend=1; Razbeg=FALSE; } if(MA1<MA2 && Razbeg==TRUE) { Trend=2; Razbeg=FALSE; } //--------------------------------------------------- //---- Ïðîâåðêà óñëîâèé âõîäà -------- if(P_Trend==100) P_Trend=Trend; if(Trend==0 && P_Trend!=0) P_Trend=0; if(Trend==1 && P_Trend!=1) { BUY_new=TRUE; P_Trend=1; } if(Trend==2 && P_Trend!=2) { SELL_new=TRUE; P_Trend=2; } //------------------------------------------------ //---- Îòêðûâàåì ïîçèöèè------------------------------ if(BUY_new==TRUE) { while(true) { RefreshRates(); price_los=Ask-StopLos*Point; price_prof=Ask+Profit*Point; ticket=OrderSend_v(Symbol(),OP_BUY,Obyem,Ask,30,price_los,price_prof,0,MagicNumbers,0,Blue); if (ticket > 0) // Ïîëó÷èëîñü :) { Alert ("Îòêðûò îðäåð BUY ",ticket); break; // Ïðîäîëæåíèå } if (Fun_Error(GetLastError_v())==1) // Îáðàáîòêà îøèáîê continue; // Ïîâòîðíàÿ ïîïûòêà return; // Âûõîä èç start() ïðè íåïðåîäîëèìîé îøèáêè } while(true) { RefreshRates(); price_los=Ask-StopLos*Point; ticket2=OrderSend_v(Symbol(),OP_BUY,Obyem,Ask,30,price_los,0,0,MagicNumbers,0,Blue); if (ticket2 > 0) // Ïîëó÷èëîñü :) { Alert ("Îòêðûò îðäåð BUY ",ticket2); return; // Âûõîä èç start() } if (Fun_Error(GetLastError_v())==1) // Îáðàáîòêà îøèáîê continue; // Ïîâòîðíàÿ ïîïûòêà return; // Âûõîä èç start() ïðè íåïðåîäîëèìîé îøèáêè } } if(SELL_new==TRUE) { while(true) { RefreshRates(); price_los=Bid+StopLos*Point; price_prof=Ask-Profit*Point; ticket=OrderSend_v(Symbol(),OP_SELL,Obyem,Bid,30,price_los,price_prof,0,MagicNumbers,0,Red); if (ticket > 0) // Ïîëó÷èëîñü :) { Alert ("Îòêðûò îðäåð SELL ",ticket); break; // Ïðîäîëæåíèå } if (Fun_Error(GetLastError_v())==1) // Îáðàáîòêà îøèáîê continue; // Ïîâòîðíàÿ ïîïûòêà return; // Âûõîä èç start() ïðè íåïðåîäîëèìîé îøèáêè } while(true) { RefreshRates(); price_los=Bid+StopLos*Point; ticket2=OrderSend_v(Symbol(),OP_SELL,Obyem,Bid,30,price_los,0,0,MagicNumbers,0,Red); if (ticket2 > 0) // Ïîëó÷èëîñü :) { Alert ("Îòêðûò îðäåð SELL ",ticket2); return; // Âûõîä èç start() } if (Fun_Error(GetLastError_v())==1) // Îáðàáîòêà îøèáîê continue; // Ïîâòîðíàÿ ïîïûòêà return; // Âûõîä èç start() ïðè íåïðåîäîëèìîé îøèáêè } } //------------------------------------------------------------------------ //---- Ïðîâåðÿåì è ïîäâèãàåì Ëîñû íà âñåõ îðäåðàõ------------------- //---- int cmd111,error111,cnt111; double StopLoss111,OpenPrice111; //---- total=OrdersTotal_v[TS_number]; for(cnt111=0;cnt111<total;cnt111++) { if(total==0) break; // Îòêðûòûõ îðäåðîâ íåò âûõîäèì èç öèêëà ìîäèôèêàöèè if(OrderSelect_v(cnt111, SELECT_BY_POS, MODE_TRADES)==true) { if(OrderMagicNumber_v!=MagicNumbers) continue; StopLoss111=OrderStopLoss_v; OpenPrice111=OrderOpenPrice_v; cmd111=OrderType_v; if(cmd111==OP_BUY || cmd111==OP_SELL) { if(cmd111==OP_BUY) { if(Bid-OpenPrice111>Point*Profit) { if(Bid-StopLoss111>Point*TrailingStop) { price_los=Bid-TrailingStop*Point; if(price_los<StopLoss111+5*Point && price_los>StopLoss111-5*Point) continue; // Íîâàÿ èòåðàöèÿ, öåíà ïî÷òè íå èçìåíèëàñü while(true) { Ans=OrderModify_v(OrderTicket_v,OrderOpenPrice_v,price_los,OrderTakeProfit_v,0,Blue); if (Ans==true) // Ïîëó÷èëîñü :) { Alert ("Ìîäèôèöèðîâàí îðäåð BUY ",OrderTicket_v); break; // Âûõîä èç öèêëà } if (Fun_Error(GetLastError_v())==1) // Îáðàáîòêà îøèáîê continue; // Ïîâòîðíàÿ ïîïûòêà break; // Âûõîäèì èç öèêëà è ïðîäîëæàåì ïåðåáîð îðäåðîâ } } } } else { if(OpenPrice111-Ask>Point*Profit) { if(StopLoss111-Ask>Point*TrailingStop) { price_los=Ask+TrailingStop*Point; if(price_los<StopLoss111+5*Point && price_los>StopLoss111-5*Point) continue; // Íîâàÿ èòåðàöèÿ, öåíà ïî÷òè íå èçìåíèëàñü while(true) { Ans=OrderModify_v(OrderTicket_v,OrderOpenPrice_v,price_los,OrderTakeProfit_v,0,Red); if (Ans==true) // Ïîëó÷èëîñü :) { Alert ("Ìîäèôèöèðîâàí îðäåð SELL ",OrderTicket_v); break; // Âûõîä èç öèêëà } if (Fun_Error(GetLastError_v())==1) // Îáðàáîòêà îøèáîê continue; // Ïîâòîðíàÿ ïîïûòêà break; // Âûõîäèì èç öèêëà è ïðîäîëæàåì ïåðåáîð îðäåðîâ } } } } } } else Print("OrderSelect_v() âåðíóë îøèáêó - ",GetLastError_v()); } //--------------------------------------------------------------- return(0); } //------------------------------------------------------------------------------------- int Sar_System() //- Ïðîñòî ñêîïèðîâàë âñþ ôóíêöèþ ñòàðò âòîðîãî ýêñïåðòà è ïåðåèìåíîâàë âñå íóæíûå ôóíêöèè. Âñå ïðîñòî! { //---- bool BUY_new,SELL_new; double SAR1,SAR2; SAR1=iSAR(Symbol(),0,0.05,0.5,0); if(start_new==true && SAR1<Bid) { order_pr="BUY"; start_new=false; } if(start_new==true && SAR1>Bid) { order_pr="SELL"; start_new=false; } if(order_pr=="SELL" && SAR1<=Bid) { BUY_new=TRUE; } if(order_pr=="BUY" && SAR1>=Bid) { SELL_new=TRUE; } if(BUY_new==TRUE) { OrderClose_v(ticket3,0.1,Ask,10,Red); ticket3=OrderSend_v(Symbol(),OP_BUY,0.1,Ask,10,0,0,0,0,0,Blue); order_pr="BUY"; } if(SELL_new==TRUE) { OrderClose_v(ticket3,0.1,Bid,10,Red); ticket3=OrderSend_v(Symbol(),OP_SELL,0.1,Bid,10,0,0,0,0,0,Red); order_pr="SELL"; } //---- return(0); } //+------------------------------------------------------------------+ int Zakryvalka_Udolyalka() { if(ticket_vs>20) Start_Close_Delete=TRUE; if(Start_Close_Delete==TRUE) { int total=OrdersTotal_v[TS_number]; for(int cikl=0; cikl<total; cikl++) { if(OrdersTotal_v[TS_number]==0) break; if(OrderSelect_v(cikl, SELECT_BY_POS, MODE_TRADES)==true) { int cmd111=OrderType_v; bool result; if(cmd111==OP_BUY) { while(true) { result=OrderClose_v(OrderTicket_v,OrderLots_v,Bid,30,Goldenrod); if (result==true) // Ïîëó÷èëîñü :) { Alert ("Çàêðûò îðäåð BUY ",OrderTicket_v); break; // Âûõîä èç öèêëà } if (Fun_Error(GetLastError_v())==1) // Îáðàáîòêà îøèáîê continue; // Ïîâòîðíàÿ ïîïûòêà break; // Âûõîäèì èç öèêëà è ïðîäîëæàåì ïåðåáîð îðäåðîâ } } if(cmd111==OP_SELL) { while(true) { result=OrderClose_v(OrderTicket_v,OrderLots_v,Ask,30,Goldenrod); if (result==true) // Ïîëó÷èëîñü :) { Alert ("Çàêðûò îðäåð SELL ",OrderTicket_v); break; // Âûõîä èç öèêëà } if (Fun_Error(GetLastError_v())==1) // Îáðàáîòêà îøèáîê continue; // Ïîâòîðíàÿ ïîïûòêà break; // Âûõîäèì èç öèêëà è ïðîäîëæàåì ïåðåáîð îðäåðîâ } } else { while(true) { result=OrderDelete_v(OrderTicket_v); if (result==true) // Ïîëó÷èëîñü :) { Alert ("Óäàëåí îðäåð ",OrderTicket_v); break; // Âûõîä èç öèêëà } if (Fun_Error(GetLastError_v())==1) // Îáðàáîòêà îøèáîê continue; // Ïîâòîðíàÿ ïîïûòêà break; // Âûõîäèì èç öèêëà è ïðîäîëæàåì ïåðåáîð îðäåðîâ } } } else Print("OrderSelect_v() 11 âåðíóë îøèáêó - ",GetLastError_v()); } } //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Ôóíêöèÿ "File_Save" ôîðìåðóåò HTML îò÷åò | //+------------------------------------------------------------------+ int File_Save( int Num_TS, datetime data, string cmd, int tiket, double volume, string symbol, double price, double SL=0, double TP=0, double OrderProf=0, double Balance=0 ) { string data_str=TimeToStr(data,TIME_DATE|TIME_MINUTES); int handle; string fst1,fst2="</td><td>",fst4="</td><td colspan=2>",END="</td></tr>",END_text,SL_str,TP_str,price_str; if(File_POS==true) fst1="<tr align=right><td>"; else fst1="<tr bgcolor=\"#E0E0E0\" align=right><td>"; if(Balance==0) END_text="</td><td colspan=2></td></tr>"; else END_text=StringConcatenate(fst2,OrderProf,fst2,Balance,END); price_str=DoubleToStr(price, 5); if(SL==0) SL_str=" "; else SL_str=DoubleToStr(SL, 5); if(TP==0) TP_str=" "; else TP_str=DoubleToStr(TP, 5); handle=FileOpen("Virtual_trade.html", FILE_CSV | FILE_READ | FILE_WRITE, ' '); if(handle>0) { FileSeek(handle, 0, SEEK_END); FileWrite(handle,fst1,File_POS_num,fst2,Num_TS,fst2,data_str,fst2,cmd,fst2,tiket,fst2,volume,fst2,symbol,fst2,price_str,fst2,SL_str,fst2,TP_str,END_text); FileClose(handle); File_POS_num++; if(File_POS==true)File_POS=false; else File_POS=true; } return(0); } //------------------------------------------------------------------------------------- //+------------------------------------------------------------------+ //| Âèðòóàëüíàÿ ôóíêöèÿ "GetLastError" | //+------------------------------------------------------------------+ int GetLastError_v() { int last_error; last_error=last_error_v; last_error_v=0; return(last_error); } //------------------------------------------------------------------------------------- //+------------------------------------------------------------------+ //| Âñïîìîãàòåëüíàÿ ôóíêöèÿ âûçûâàåòñÿ äëÿ ðàñ÷åòà Ïðîôèòîâ | //+------------------------------------------------------------------+ double OrderProfit_Raschet(int type, string symbol, double lots, double open_price, double close_price) { double Profit_Raschet; double LOTSIZE=MarketInfo(Symbol(),MODE_LOTSIZE); if(symbol=="EURUSD") { if(type==0){ Profit_Raschet=LOTSIZE*lots*(close_price-open_price); return(Profit_Raschet); } else { Profit_Raschet=LOTSIZE*lots*(open_price-close_price); return(Profit_Raschet); } } return(Profit_Raschet); } //------------------------------------------------------------------------------------- //+------------------------------------------------------------------+ //| Âñïîìîãàòåëüíàÿ ôóíêöèÿ âûçûâàåòñÿ äëÿ çàêðûòèÿ Ëîññîâ è Ïðîôèòîâ| //+------------------------------------------------------------------+ bool loss_profit(int cikl1, color Color, string stop ) { //---- Ëîêàëüíûå ïåðåìåííûå int LOTSIZE; string Name_Close,Name_Close_Line,Type_print; //-------------------------- LOTSIZE=MarketInfo(Symbol(),MODE_LOTSIZE); ticket_v2[POS_v2]=ticket_v1[cikl1]; symbol_v2[POS_v2]=symbol_v1[cikl1]; OrderType_v2[POS_v2]=OrderType_v1[cikl1]; volume_v2[POS_v2]=volume_v1[cikl1]; comment_v2[POS_v2]=comment_v1[cikl1]; magic_v2[POS_v2]=magic_v1[cikl1]; OrderOpenTime_v2[POS_v2]=OrderOpenTime_v1[cikl1]; OrderOpenPrice_v2[POS_v2]=OrderOpenPrice_v1[cikl1]; stoploss_v2[POS_v2]=stoploss_v1[cikl1]; takeprofit_v2[POS_v2]=takeprofit_v1[cikl1]; OrderCloseTime_v2[POS_v2]=TimeCurrent(); AccountBalance_v[TS_num[cikl1]]+=OrderProfit_v2[POS_v2]; if(Visualization) { if(Jurnal_Print)Print(stop,ticket_v2[POS_v2]," at ",OrderClosePrice_v2[POS_v2]," (",Bid,"/",Ask,")"); if(stop=="stop loss #") Type_print="s/l"; if(stop=="take profit #") Type_print="t/p"; double Ord_prof=NormalizeDouble(OrderProfit_v2[POS_v2],2); double AccountBal=NormalizeDouble(AccountBalance_v[TS_num[cikl1]],2); if(File_Print)File_Save(TS_num[cikl1], OrderCloseTime_v2[POS_v2], Type_print, ticket_v2[POS_v2], volume_v2[POS_v2], symbol_v2[POS_v2], OrderClosePrice_v2[POS_v2], stoploss_v2[POS_v2], takeprofit_v2[POS_v2] ,Ord_prof ,AccountBal ); if(Color==0) Color=Goldenrod; Name_Close=DoubleToStr(ticket_v2[POS_v2], 0)+"Close"; ObjectCreate(Name_Close, OBJ_ARROW, 0, OrderCloseTime_v2[POS_v2], OrderClosePrice_v2[POS_v2]); ObjectSet(Name_Close, OBJPROP_ARROWCODE, 3); ObjectSet(Name_Close, OBJPROP_COLOR, Goldenrod); if(OrderType_v1[cikl1]==0) Color=Blue; else Color=Red; Name_Close_Line=DoubleToStr(ticket_v2[POS_v2], 0)+"Close_Line"; ObjectCreate(Name_Close_Line, OBJ_TREND, 0, OrderOpenTime_v2[POS_v2], OrderOpenPrice_v2[POS_v2], OrderCloseTime_v2[POS_v2], OrderClosePrice_v2[POS_v2]); ObjectSet(Name_Close_Line, OBJPROP_RAY, False); ObjectSet(Name_Close_Line, OBJPROP_STYLE, 2); ObjectSet(Name_Close_Line, OBJPROP_COLOR, Color); ObjectDelete(Visual_Loss[cikl1]); ObjectDelete(Visual_Profit[cikl1]); ObjectDelete(Visual_Open[cikl1]); WindowRedraw(); } ticket_v1[cikl1]=0; POS_Svobodn[POS_Svob]=cikl1; Vsego_POS_Svob++; POS_Svob++; if(POS_Svob==1000) POS_Svob=0; POS_v2++; if(POS_v2==1000) POS_v2=0; OrdersTotal_v[TS_num[cikl1]]--; OrdersHistoryTotal_v[TS_num[cikl1]]++; if(OrdersHistoryTotal_v[TS_num[cikl1]]>1000) OrdersHistoryTotal_v[TS_num[cikl1]]=1000; return(0); } //------------------------------------------------------------------------------------- //+------------------------------------------------------------------+ //| Âñïîìîãàòåëüíàÿ ôóíêöèÿ âûçûâàåòñÿ äëÿ Îòêðûòèÿ îòëîæåííûõ îðä. | //+------------------------------------------------------------------+ bool Open_otl_order(int cikl1, int type, color Color, string tipe_str ) { //---- Ëîêàëüíûå ïåðåìåííûå datetime OrderOpenTime_otl; string Name_Open,Name_Open_Line; //-------------------------- OrderType_v1[cikl1]=type; OrderOpenTime_otl=OrderOpenTime_v1[cikl1]; OrderOpenTime_v1[cikl1]=TimeCurrent(); if(Visualization) { if(Jurnal_Print)Print("order #",ticket_v1[cikl1],tipe_str,volume_v1[cikl1]," ",symbol_v1[cikl1]," is opened at ",OrderOpenPrice_v1[cikl1]); if(File_Print)File_Save(TS_num[cikl1], OrderOpenTime_v1[cikl1], tipe_str, ticket_v1[cikl1], volume_v1[cikl1], symbol_v1[cikl1], OrderOpenPrice_v1[cikl1], stoploss_v1[cikl1], takeprofit_v1[cikl1] ); Name_Open=DoubleToStr(ticket_v1[cikl1], 0)+"Open_otl"; ObjectCreate(Name_Open, OBJ_ARROW, 0, OrderOpenTime_v1[cikl1], OrderOpenPrice_v1[cikl1]); ObjectSet(Name_Open, OBJPROP_ARROWCODE, 1); ObjectSet(Name_Open, OBJPROP_COLOR, Color); Name_Open_Line=DoubleToStr(ticket_v1[cikl1], 0)+"Open_otl_Line"; ObjectCreate(Name_Open_Line, OBJ_TREND, 0, OrderOpenTime_otl, OrderOpenPrice_v1[cikl1], OrderOpenTime_v1[cikl1], OrderOpenPrice_v1[cikl1]); ObjectSet(Name_Open_Line, OBJPROP_RAY, False); ObjectSet(Name_Open_Line, OBJPROP_STYLE, 4); ObjectSet(Name_Open_Line, OBJPROP_COLOR, Color); } return(0); } //------------------------------------------------------------------------------------- //+------------------------------------------------------------------+ //| Âèðòóàëüíàÿ ôóíêöèÿ "OrderSend" | //+------------------------------------------------------------------+ int OrderSend_v( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, datetime expiration, color arrow_color=0 ) { int POS_v,STOPLEVEL; string Name_Open,Name_stoploss,Name_takeprofit,Name_OrderLine,Type_print; double price_op,MAXLOT,MINLOT; MAXLOT=MarketInfo(symbol,MODE_MAXLOT); MINLOT=MarketInfo(symbol,MODE_MINLOT); STOPLEVEL=MarketInfo(symbol,MODE_STOPLEVEL); //-- Îáðàáîòêà îøèáîê if(MAX_Orders!=0 && OrdersTotal_v[TS_number]==MAX_Orders) { last_error_v=148; return(-1); } if(cmd==0 || cmd==2 || cmd==4) price_op=Ask; if(cmd==1 || cmd==3 || cmd==5) price_op=Bid; if(cmd<2) { if(price>price_op+slippage*Point || price<price_op-slippage*Point) { last_error_v=129; return(-1); } } if(cmd==2 || cmd==5) { if(price>price_op-STOPLEVEL*Point || price==0) { last_error_v=130; return(-1); } } if(cmd==3 || cmd==4) { if(price<price_op+STOPLEVEL*Point || price==0) { last_error_v=130; return(-1); } } if(cmd==0 || cmd==2 || cmd==4) { if(stoploss>price-STOPLEVEL*Point && stoploss>0) { last_error_v=130; return(-1); } if(takeprofit<price+STOPLEVEL*Point && takeprofit>0) { last_error_v=130; return(-1); } } if(cmd==1 || cmd==3 || cmd==5) { if(stoploss<price+STOPLEVEL*Point && stoploss>0) { last_error_v=130; return(-1); } if(takeprofit>price-STOPLEVEL*Point && takeprofit>0) { last_error_v=130; return(-1); } } if(volume>MAXLOT || volume<MINLOT) { last_error_v=131; return(-1); } if(expiration<TimeCurrent()+600 && expiration>0) { last_error_v=3; return(-1); } //------------------- ticket_vs++; if(Vsego_POS_Svob>0) { if(POS_Svob==0) POS_Svob=999; else POS_Svob--; POS_v=POS_Svobodn[POS_Svob]; Vsego_POS_Svob--; } else { POS_v=POS_v1; POS_v1++; } //- Print(" Îòëàäêà: POS= ",POS_v," Âñåãî ñâ ïîñ= ",Vsego_POS_Svob); ticket_v1[POS_v]=ticket_vs; symbol_v1[POS_v]=symbol; OrderType_v1[POS_v]=cmd; volume_v1[POS_v]=volume; comment_v1[POS_v]=comment; magic_v1[POS_v]=magic; OrderOpenTime_v1[POS_v]=TimeCurrent(); OrderOpenPrice_v1[POS_v]=price; stoploss_v1[POS_v]=stoploss; takeprofit_v1[POS_v]=takeprofit; expiration_v1[POS_v]=expiration; TS_num[POS_v]=TS_number; OrdersTotal_v[TS_number]++; if(Visualization) { Name_stoploss=DoubleToStr(ticket_vs, 0)+"l"; Name_takeprofit=DoubleToStr(ticket_vs, 0)+"t"; Name_OrderLine=DoubleToStr(ticket_vs, 0)+"OL"; if(arrow_color==0) { if(OrderType_v1[POS_v]==0) arrow_color=Blue; else arrow_color=Red; } Color_v1[POS_v]=arrow_color; if(OrderType_v1[POS_v]==0) Type_print=" buy "; if(OrderType_v1[POS_v]==1) Type_print=" sell "; if(OrderType_v1[POS_v]==2) Type_print=" buy limit "; if(OrderType_v1[POS_v]==3) Type_print=" sell limit "; if(OrderType_v1[POS_v]==4) Type_print=" buy stop "; if(OrderType_v1[POS_v]==5) Type_print=" sell stop "; if(Jurnal_Print)Print("open #",ticket_v1[POS_v],Type_print,volume_v1[POS_v]," ",symbol_v1[POS_v]," at ",OrderOpenPrice_v1[POS_v]," sl: ",stoploss_v1[POS_v]," tp: ",takeprofit_v1[POS_v]," ok"); if(File_Print)File_Save(TS_num[POS_v], OrderOpenTime_v1[POS_v], Type_print, ticket_v1[POS_v], volume_v1[POS_v], symbol_v1[POS_v], OrderOpenPrice_v1[POS_v], stoploss_v1[POS_v], takeprofit_v1[POS_v]); Visual_Loss[POS_v]=Name_stoploss; Visual_Profit[POS_v]=Name_takeprofit; Visual_Open[POS_v]=Name_OrderLine; Name_Open=DoubleToStr(ticket_vs, 0)+"Open"; ObjectCreate(Name_Open, OBJ_ARROW, 0, OrderOpenTime_v1[POS_v], price); ObjectSet(Name_Open, OBJPROP_ARROWCODE, 1); ObjectSet(Name_Open, OBJPROP_COLOR, arrow_color); ObjectCreate(Name_stoploss, OBJ_TREND, 0, OrderOpenTime_v1[POS_v]-60, stoploss, OrderOpenTime_v1[POS_v], stoploss); ObjectSet(Name_stoploss, OBJPROP_BACK, true); ObjectSet(Name_stoploss, OBJPROP_STYLE, 3); ObjectSet(Name_stoploss, OBJPROP_COLOR, Red); ObjectCreate(Name_takeprofit, OBJ_TREND, 0, OrderOpenTime_v1[POS_v]-60,takeprofit, OrderOpenTime_v1[POS_v], takeprofit); ObjectSet(Name_takeprofit, OBJPROP_BACK, true); ObjectSet(Name_takeprofit, OBJPROP_STYLE, 3); ObjectSet(Name_takeprofit, OBJPROP_COLOR, Red); ObjectCreate(Name_OrderLine, OBJ_TREND, 0, OrderOpenTime_v1[POS_v]-60,price, OrderOpenTime_v1[POS_v], price); ObjectSet(Name_OrderLine, OBJPROP_BACK, true); ObjectSet(Name_OrderLine, OBJPROP_STYLE, 3); ObjectSet(Name_OrderLine, OBJPROP_COLOR, Green); } last_error_v=0; return(ticket_vs); } //------------------------------------------------------------------------------------- //+------------------------------------------------------------------+ //| Âèðòóàëüíàÿ ôóíêöèÿ "OrderClose" | //+------------------------------------------------------------------+ bool OrderClose_v( int ticket, double lots, double price, int slippage, color Color=0 ) { //---- Ëîêàëüíûå ïåðåìåííûå int cikl1,cikl2,POS_v3; string Name_Close,Name_Close_Line,Type_print; double price_cl; bool Close_order=FALSE; //-------------------------- //-- Îáðàáîòêà îøèáîê if(ticket==0) { last_error_v=4051; return(Close_order); } //------------------- if(OrderTicket_v==ticket && ticket_v1[POS_slkt]==ticket && TS_number==TS_num[POS_slkt]) cikl1=POS_slkt; else { for(cikl1=0;cikl1<1000;cikl1++) { if(OrdersTotal_v[TS_number]==0 || cikl1==POS_v1) break; if(ticket_v1[cikl1]==0 || TS_number!=TS_num[cikl1]) continue; if(ticket_v1[cikl1]==ticket) break; } } if(ticket_v1[cikl1]==ticket) { //-- Îáðàáîòêà îøèáîê if(OrderType_v1[cikl1]>1) { last_error_v=3; return(Close_order); } if(OrderType_v1[cikl1]==0) price_cl=Bid; if(OrderType_v1[cikl1]==1) price_cl=Ask; if(price>price_cl+slippage*Point || price<price_cl-slippage*Point) { last_error_v=129; return(Close_order); } if(lots>volume_v1[cikl1]) { last_error_v=131; return(Close_order); } //------------------- ticket_v2[POS_v2]=ticket_v1[cikl1]; symbol_v2[POS_v2]=symbol_v1[cikl1]; OrderType_v2[POS_v2]=OrderType_v1[cikl1]; volume_v2[POS_v2]=lots; comment_v2[POS_v2]=comment_v1[cikl1]; magic_v2[POS_v2]=magic_v1[cikl1]; OrderOpenTime_v2[POS_v2]=OrderOpenTime_v1[cikl1]; OrderOpenPrice_v2[POS_v2]=OrderOpenPrice_v1[cikl1]; stoploss_v2[POS_v2]=stoploss_v1[cikl1]; takeprofit_v2[POS_v2]=takeprofit_v1[cikl1]; OrderCloseTime_v2[POS_v2]=TimeCurrent(); OrderClosePrice_v2[POS_v2]=price; OrderProfit_v2[POS_v2]=OrderProfit_Raschet(OrderType_v1[cikl1], symbol_v1[cikl1], volume_v1[cikl1], OrderOpenPrice_v1[cikl1], OrderClosePrice_v2[POS_v2]); AccountBalance_v[TS_num[cikl1]]+=OrderProfit_v2[POS_v2]; if(Visualization) { if(OrderType_v1[cikl1]==0) Type_print=" buy "; if(OrderType_v1[cikl1]==1) Type_print=" sell "; if(Jurnal_Print)Print("close #",ticket,Type_print,lots," ",symbol_v1[cikl1]," at ",OrderOpenPrice_v1[cikl1]," sl: ",stoploss_v1[cikl1]," tp: ",takeprofit_v1[cikl1]," at price ",price); double Ord_prof=NormalizeDouble(OrderProfit_v2[POS_v2],2); double AccountBal=NormalizeDouble(AccountBalance_v[TS_num[cikl1]],2); if(File_Print)File_Save(TS_num[cikl1], OrderCloseTime_v2[POS_v2], "close", ticket_v2[POS_v2], volume_v2[POS_v2], symbol_v2[POS_v2], OrderClosePrice_v2[POS_v2], stoploss_v2[POS_v2], takeprofit_v2[POS_v2] ,Ord_prof ,AccountBal ); if(Color==0) Color=Goldenrod; Name_Close=DoubleToStr(ticket_v2[POS_v2], 0)+"Close"; ObjectCreate(Name_Close, OBJ_ARROW, 0, OrderCloseTime_v2[POS_v2], OrderClosePrice_v2[POS_v2]); ObjectSet(Name_Close, OBJPROP_ARROWCODE, 3); ObjectSet(Name_Close, OBJPROP_COLOR, Color); Name_Close_Line=DoubleToStr(ticket_v2[POS_v2], 0)+"Close_Line"; ObjectCreate(Name_Close_Line, OBJ_TREND, 0, OrderOpenTime_v2[POS_v2], OrderOpenPrice_v2[POS_v2], OrderCloseTime_v2[POS_v2], OrderClosePrice_v2[POS_v2]); ObjectSet(Name_Close_Line, OBJPROP_RAY, False); ObjectSet(Name_Close_Line, OBJPROP_STYLE, 2); ObjectSet(Name_Close_Line, OBJPROP_COLOR, Color_v1[cikl1]); } if(volume_v1[cikl1]==lots) { ticket_v1[cikl1]=0; if(Visualization) { ObjectDelete(Visual_Loss[cikl1]); ObjectDelete(Visual_Profit[cikl1]); ObjectDelete(Visual_Open[cikl1]); WindowRedraw(); } POS_Svobodn[POS_Svob]=cikl1; Vsego_POS_Svob++; POS_Svob++; if(POS_Svob==1000) POS_Svob=0; POS_v2++; if(POS_v2==1000) POS_v2=0; OrdersTotal_v[TS_number]--; OrdersHistoryTotal_v[TS_number]++; if(OrdersHistoryTotal_v[TS_number]>1000) OrdersHistoryTotal_v[TS_number]=1000; last_error_v=0; Close_order=TRUE; } else { volume_v1[cikl1]-=lots; ticket_vs++; ticket_v1[cikl1]=ticket_vs; last_error_v=0; Close_order=TRUE; } } if(Visualization) { if(Vsego_POS_Svob>0) { cikl1=POS_Svob; while(true) { if(cikl2==Vsego_POS_Svob) break; cikl2++; if(cikl1==0) cikl1=999; else cikl1--; POS_v3=POS_Svobodn[cikl1]; ObjectDelete(Visual_Loss[POS_v3]); ObjectDelete(Visual_Profit[POS_v3]); ObjectDelete(Visual_Open[POS_v3]); } } WindowRedraw(); } return(Close_order); } //------------------------------------------------------------------------------------- //+------------------------------------------------------------------+ //| Âèðòóàëüíàÿ ôóíêöèÿ "OrderCloseBy" | //+------------------------------------------------------------------+ bool OrderCloseBy_v( int ticket, int opposite, color Color=0) { int cikl1,Pos_ticket=-10,Pos_opposite=-10,LOTSIZE; bool CloseBy=FALSE,Close_order1,Close_order2; double price_cl,volume_cl; LOTSIZE=MarketInfo(Symbol(),MODE_LOTSIZE); if(OrdersTotal_v[TS_number]==0) { last_error_v=3; return(CloseBy); } if(ticket==0 || opposite==0) { last_error_v=3; return(CloseBy); } for(cikl1=0;cikl1<1000;cikl1++) { if(cikl1==POS_v1) break; if(ticket_v1[cikl1]==0 || TS_number!=TS_num[cikl1]) continue; if(ticket_v1[cikl1]==ticket) Pos_ticket=cikl1; if(ticket_v1[cikl1]==opposite) Pos_opposite=cikl1; if(Pos_ticket!=-10 && Pos_opposite!=-10) break; } //-- Îáðàáîòêà îøèáîê if(Pos_ticket==-10 || Pos_opposite==-10) { last_error_v=3; return(CloseBy); } if(symbol_v1[Pos_ticket]!=symbol_v1[Pos_opposite]) { last_error_v=3; return(CloseBy); } if(OrderType_v1[Pos_ticket]>1 || OrderType_v1[Pos_opposite]>1) { last_error_v=3; return(CloseBy); } if(OrderType_v1[Pos_ticket]==OrderType_v1[Pos_opposite]) { last_error_v=3; return(CloseBy); } //------------------- if(volume_v1[Pos_ticket]==volume_v1[Pos_opposite]) { volume_cl=volume_v1[Pos_ticket]; } else { if(volume_v1[Pos_ticket]>volume_v1[Pos_opposite]) volume_cl=volume_v1[Pos_opposite]; else volume_cl=volume_v1[Pos_ticket]; } if(Color==0) Color=Goldenrod; Close_order1=OrderClose_v(ticket,volume_cl,Bid,30,Color); Close_order2=OrderClose_v(opposite,volume_cl,Bid,30,Color); if(Close_order1==TRUE && Close_order2==TRUE) CloseBy=TRUE; if(Visualization) { double OrderProfit_r1=OrderProfit_Raschet(OrderType_v1[Pos_ticket], symbol_v1[Pos_ticket], volume_cl, OrderOpenPrice_v1[Pos_ticket], OrderClosePrice_v2[Pos_ticket]); double AccountBalance_r1=AccountBalance_v[TS_num[Pos_ticket]]+OrderProfit_r1; double Ord_prof=NormalizeDouble(OrderProfit_r1,2); double AccountBal=NormalizeDouble(AccountBalance_r1,2); if(File_Print)File_Save(TS_num[Pos_ticket], TimeCurrent(), "close by", ticket_v2[Pos_ticket], volume_cl, symbol_v2[Pos_ticket], Bid, stoploss_v2[Pos_ticket], takeprofit_v2[Pos_ticket] ,Ord_prof ,AccountBal ); double OrderProfit_r2=OrderProfit_Raschet(OrderType_v1[Pos_opposite], symbol_v1[Pos_opposite], volume_cl, OrderOpenPrice_v1[Pos_opposite], OrderClosePrice_v2[Pos_opposite]); double AccountBalance_r2=AccountBalance_r1+OrderProfit_r2; Ord_prof=NormalizeDouble(OrderProfit_r2,2); AccountBal=NormalizeDouble(AccountBalance_r2,2); if(File_Print)File_Save(TS_num[Pos_opposite], TimeCurrent(), "close by", ticket_v2[Pos_opposite], volume_cl, symbol_v2[Pos_opposite], Bid, stoploss_v2[Pos_opposite], takeprofit_v2[Pos_opposite] ,Ord_prof ,AccountBal ); } return(CloseBy); } //------------------------------------------------------------------------------------- //+------------------------------------------------------------------+ //| Âèðòóàëüíàÿ ôóíêöèÿ "OrderDelete" | //+------------------------------------------------------------------+ bool OrderDelete_v( int ticket, color arrow_color=0, int TS_number2=0) { int cikl1,cikl2,POS_v3; bool OrderDel=FALSE; string Name_Del,Name_Del_Line,Type_print; if(TS_number2!=0) TS_number=TS_number2; //-- Îáðàáîòêà îøèáîê if(ticket==0) { last_error_v=4051; return(OrderDel); } //------------------- if(OrderTicket_v==ticket && ticket_v1[POS_slkt]==ticket && TS_number==TS_num[POS_slkt]) cikl1=POS_slkt; else { for(cikl1=0;cikl1<1000;cikl1++) { if(OrdersTotal_v[TS_number]==0 || cikl1==POS_v1) break; if(ticket_v1[cikl1]==0 || TS_number!=TS_num[cikl1]) continue; if(ticket_v1[cikl1]==ticket) break; } } if(ticket_v1[cikl1]==ticket) { //-- Îáðàáîòêà îøèáîê if(OrderType_v1[cikl1]<2) { last_error_v=4108; return(OrderDel); } //------------------- ticket_v2[POS_v2]=ticket_v1[cikl1]; symbol_v2[POS_v2]=symbol_v1[cikl1]; OrderType_v2[POS_v2]=OrderType_v1[cikl1]; volume_v2[POS_v2]=volume_v1[cikl1]; comment_v2[POS_v2]=comment_v1[cikl1]; magic_v2[POS_v2]=magic_v1[cikl1]; OrderOpenTime_v2[POS_v2]=OrderOpenTime_v1[cikl1]; OrderOpenPrice_v2[POS_v2]=OrderOpenPrice_v1[cikl1]; stoploss_v2[POS_v2]=stoploss_v1[cikl1]; takeprofit_v2[POS_v2]=takeprofit_v1[cikl1]; OrderCloseTime_v2[POS_v2]=TimeCurrent(); OrderClosePrice_v2[POS_v2]=0; OrderProfit_v2[POS_v2]=0; if(OrderType_v1[cikl1]==2) Type_print=" buy limit "; if(OrderType_v1[cikl1]==3) Type_print=" sell limit "; if(OrderType_v1[cikl1]==4) Type_print=" buy stop "; if(OrderType_v1[cikl1]==5) Type_print=" sell stop "; if(Visualization) { if(Jurnal_Print)Print("delete #",ticket_v1[cikl1],Type_print,volume_v1[cikl1]," ",symbol_v1[cikl1]," at ",OrderOpenPrice_v1[cikl1]," sl: ",stoploss_v1[cikl1]," tp: ",takeprofit_v1[cikl1]," ok"); if(File_Print)File_Save(TS_num[cikl1], OrderCloseTime_v2[POS_v2], "delete", ticket_v2[POS_v2], volume_v2[POS_v2], symbol_v2[POS_v2], OrderOpenPrice_v2[POS_v2], stoploss_v2[POS_v2], takeprofit_v2[POS_v2] ); if(arrow_color==0) arrow_color=Black; Name_Del=DoubleToStr(ticket_v2[POS_v2], 0)+"delete"; ObjectCreate(Name_Del, OBJ_ARROW, 0, OrderCloseTime_v2[POS_v2], OrderOpenPrice_v1[cikl1]); ObjectSet(Name_Del, OBJPROP_ARROWCODE, 3); ObjectSet(Name_Del, OBJPROP_COLOR, arrow_color); Name_Del_Line=DoubleToStr(ticket_v2[POS_v2], 0)+"delete_Line"; ObjectCreate(Name_Del_Line, OBJ_TREND, 0, OrderOpenTime_v2[POS_v2], OrderOpenPrice_v2[POS_v2], OrderCloseTime_v2[POS_v2], OrderOpenPrice_v2[POS_v2]); ObjectSet(Name_Del_Line, OBJPROP_RAY, False); ObjectSet(Name_Del_Line, OBJPROP_STYLE, 2); ObjectSet(Name_Del_Line, OBJPROP_COLOR, Color_v1[cikl1]); ObjectDelete(Visual_Loss[cikl1]); ObjectDelete(Visual_Profit[cikl1]); ObjectDelete(Visual_Open[cikl1]); WindowRedraw(); } ticket_v1[cikl1]=0; POS_Svobodn[POS_Svob]=cikl1; Vsego_POS_Svob++; POS_Svob++; if(POS_Svob==1000) POS_Svob=0; POS_v2++; if(POS_v2==1000) POS_v2=0; OrdersTotal_v[TS_number]--; OrdersHistoryTotal_v[TS_number]++; if(OrdersHistoryTotal_v[TS_number]>1000) OrdersHistoryTotal_v[TS_number]=1000; } if(Visualization) { if(Vsego_POS_Svob>0) { cikl1=POS_Svob; while(true) { if(cikl2==Vsego_POS_Svob) break; cikl2++; if(cikl1==0) cikl1=999; else cikl1--; POS_v3=POS_Svobodn[cikl1]; ObjectDelete(Visual_Loss[POS_v3]); ObjectDelete(Visual_Profit[POS_v3]); ObjectDelete(Visual_Open[POS_v3]); } } WindowRedraw(); } return(OrderDel); } //------------------------------------------------------------------------------------- //+------------------------------------------------------------------+ //| Âèðòóàëüíàÿ ôóíêöèÿ "OrderModify" | //+------------------------------------------------------------------+ bool OrderModify_v( int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=0 ) { int cikl1,STOPLEVEL; bool OrderMod=FALSE; string Type_print; //-- Îáðàáîòêà îøèáîê if(ticket==0) { last_error_v=4051; return(OrderMod); } //------------------- if(OrderTicket_v==ticket && ticket_v1[POS_slkt]==ticket && TS_number==TS_num[POS_slkt]) cikl1=POS_slkt; else { for(cikl1=0;cikl1<1000;cikl1++) { if(OrdersTotal_v[TS_number]==0 || cikl1==POS_v1) break; if(ticket_v1[cikl1]==0 || TS_number!=TS_num[cikl1]) continue; if(ticket_v1[cikl1]==ticket) break; } } if(ticket_v1[cikl1]==ticket) { STOPLEVEL=MarketInfo(symbol_v1[cikl1],MODE_STOPLEVEL); //- Print("Îòëàäêà: STOPLEVEL = ",STOPLEVEL); if(OrderType_v1[cikl1]<2) { if(price!=OrderOpenPrice_v1[cikl1]) { last_error_v=3; return(OrderMod); } if(OrderType_v1[cikl1]==0) { if(stoploss>Bid-STOPLEVEL*Point && stoploss>0 && stoploss!=stoploss_v1[cikl1]) { last_error_v=130; return(OrderMod); } if(takeprofit<Bid+STOPLEVEL*Point && takeprofit>0 && takeprofit!=takeprofit_v1[cikl1]) { last_error_v=130; return(OrderMod); } } if(OrderType_v1[cikl1]==1) { if(stoploss<Ask+STOPLEVEL*Point && stoploss>0 && stoploss!=stoploss_v1[cikl1]) { last_error_v=130; return(OrderMod); } if(takeprofit>Ask-STOPLEVEL*Point && takeprofit>0 && takeprofit!=takeprofit_v1[cikl1]) { last_error_v=130; return(OrderMod); } } stoploss_v1[cikl1]=stoploss; takeprofit_v1[cikl1]=takeprofit; } if(OrderType_v1[cikl1]>1) { if(OrderType_v1[cikl1]==2) { if(price>Ask-STOPLEVEL*Point || price==0) { last_error_v=130; return(OrderMod); } if(stoploss>price-STOPLEVEL*Point && stoploss>0) { last_error_v=130; return(OrderMod); } if(takeprofit<price+STOPLEVEL*Point && takeprofit>0) { last_error_v=130; return(OrderMod); } } if(OrderType_v1[cikl1]==3) { if(price<Bid+STOPLEVEL*Point || price==0) { last_error_v=130; return(OrderMod); } if(stoploss<price+STOPLEVEL*Point && stoploss>0) { last_error_v=130; return(OrderMod); } if(takeprofit>price-STOPLEVEL*Point && takeprofit>0) { last_error_v=130; return(OrderMod); } } if(OrderType_v1[cikl1]==4) { if(price<Ask+STOPLEVEL*Point || price==0) { last_error_v=130; return(OrderMod); } if(stoploss<price+STOPLEVEL*Point && stoploss>0) { last_error_v=130; return(OrderMod); } if(takeprofit>price-STOPLEVEL*Point && takeprofit>0) { last_error_v=130; return(OrderMod); } } if(OrderType_v1[cikl1]==5) { if(price>Bid-STOPLEVEL*Point || price==0) { last_error_v=130; return(OrderMod); } if(stoploss>price-STOPLEVEL*Point && stoploss>0) { last_error_v=130; return(OrderMod); } if(takeprofit<price+STOPLEVEL*Point && takeprofit>0) { last_error_v=130; return(OrderMod); } } if(expiration<TimeCurrent()+600 && expiration>0) { last_error_v=3; return(OrderMod); } OrderOpenPrice_v1[cikl1]=price; stoploss_v1[cikl1]=stoploss; takeprofit_v1[cikl1]=takeprofit; expiration_v1[cikl1]=expiration; } if(Visualization) { ObjectSet(Visual_Open[cikl1], 1, OrderOpenPrice_v1[cikl1]); ObjectSet(Visual_Open[cikl1], 3, OrderOpenPrice_v1[cikl1]); ObjectSet(Visual_Loss[cikl1], 1, stoploss_v1[cikl1]); ObjectSet(Visual_Loss[cikl1], 3, stoploss_v1[cikl1]); ObjectSet(Visual_Profit[cikl1], 1, takeprofit_v1[cikl1]); ObjectSet(Visual_Profit[cikl1], 3, takeprofit_v1[cikl1]); if(OrderType_v1[cikl1]==0) Type_print=" buy "; if(OrderType_v1[cikl1]==1) Type_print=" sell "; if(OrderType_v1[cikl1]==2) Type_print=" buy limit "; if(OrderType_v1[cikl1]==3) Type_print=" sell limit "; if(OrderType_v1[cikl1]==4) Type_print=" buy stop "; if(OrderType_v1[cikl1]==5) Type_print=" sell stop "; if(Jurnal_Print)Print("modify #",ticket_v1[cikl1],Type_print,volume_v1[cikl1]," ",symbol_v1[cikl1]," at ",OrderOpenPrice_v1[cikl1]," sl: ",stoploss_v1[cikl1]," tp: ",takeprofit_v1[cikl1]," ok"); if(File_Print)File_Save(TS_num[cikl1], TimeCurrent(), "modify", ticket_v1[cikl1], volume_v1[cikl1], symbol_v1[cikl1], OrderOpenPrice_v1[cikl1], stoploss_v1[cikl1], takeprofit_v1[cikl1]); } OrderMod=TRUE; } return(OrderMod); } //------------------------------------------------------------------------------------- //+------------------------------------------------------------------+ //| Âèðòóàëüíàÿ ôóíêöèÿ "OrderSelect" | //+------------------------------------------------------------------+ bool OrderSelect_v( int index, int select, int pool=0 ) { int cikl1,cikl2,start1,finish1; bool OrderSlct=FALSE; if(select==SELECT_BY_POS) { if(pool==MODE_TRADES) { if(index<=OrdersTotal_v[TS_number]/2) { for(cikl1=0;cikl1<POS_v1;cikl1++) { if(OrdersTotal_v[TS_number]==0) break; if(ticket_v1[cikl1]==0 || TS_number!=TS_num[cikl1]) continue; if(cikl2==index) { OrderSlct=TRUE; break; } cikl2++; } } else { cikl2=OrdersTotal_v[TS_number]-1; for(cikl1=POS_v1-1;cikl1>=0;cikl1--) { if(OrdersTotal_v[TS_number]==0 || cikl1<0) break; if(ticket_v1[cikl1]==0 || TS_number!=TS_num[cikl1]) continue; if(cikl2==index) { OrderSlct=TRUE; break; } cikl2--; } } if(OrderSlct) { OrderTicket_v=ticket_v1[cikl1]; OrderSymbol_v=symbol_v1[cikl1]; OrderType_v=OrderType_v1[cikl1]; OrderLots_v=volume_v1[cikl1]; OrderComment_v=comment_v1[cikl1]; OrderMagicNumber_v=magic_v1[cikl1]; OrderOpenTime_v=OrderOpenTime_v1[cikl1]; OrderOpenPrice_v=OrderOpenPrice_v1[cikl1]; OrderStopLoss_v=stoploss_v1[cikl1]; OrderTakeProfit_v=takeprofit_v1[cikl1]; OrderCloseTime_v=0; OrderClosePrice_v=0; OrderProfit_v=OrderProfit_v1[cikl1]; OrderCommission_v=0; OrderExpiration_v=0; OrderPrint_v="..."; OrderSwap_v=0; POS_slkt=cikl1; } else { OrderTicket_v=0; OrderSymbol_v=NULL; OrderType_v=0; OrderLots_v=0; OrderComment_v=NULL; OrderMagicNumber_v=0; OrderOpenTime_v=0; OrderOpenPrice_v=0; OrderStopLoss_v=0; OrderTakeProfit_v=0; OrderCloseTime_v=0; OrderClosePrice_v=0; OrderProfit_v=0; OrderCommission_v=0; OrderExpiration_v=0; OrderPrint_v=NULL; OrderSwap_v=0; last_error_v=0; return(OrderSlct); } } if(pool==MODE_HISTORY) { if(TS_Friendship==FALSE) { OrdersHistoryTotal_v[0]=0; for(int cicl=1; cicl<=TS_SUM; cicl++) OrdersHistoryTotal_v[0]+=OrdersHistoryTotal_v[cicl]; } if(index<=OrdersHistoryTotal_v[TS_number]/2) { finish1=POS_v2; if(OrdersHistoryTotal_v[0]==1000 && POS_v2<999) { start1=POS_v2; finish1=1000; } for(cikl1=start1;cikl1<finish1;cikl1++) { if(OrdersHistoryTotal_v[TS_number]==0) break; if(ticket_v2[cikl1]==0 || TS_number!=TS_num[cikl1]) { if(start1>0 && cikl1==finish1-1) { start1=0; cikl1=-1; finish1=POS_v2; } continue; } if(cikl2==index) { OrderSlct=TRUE; break; } cikl2++; } } else { if(OrdersHistoryTotal_v[0]==1000 && POS_v2<999) start1=-10; cikl2=OrdersHistoryTotal_v[TS_number]-1; for(cikl1=POS_v2-1;cikl1>=finish1;cikl1--) { if(OrdersHistoryTotal_v[TS_number]==0 || cikl1<0) break; if(ticket_v2[cikl1]==0 || TS_number!=TS_num[cikl1]) { if(start1<0 && cikl1==finish1) { start1=10; cikl1=1000; finish1=POS_v2; } continue; } if(cikl2==index) { OrderSlct=TRUE; break; } cikl2--; } } if(OrderSlct) { OrderTicket_v=ticket_v2[cikl1]; OrderSymbol_v=symbol_v2[cikl1]; OrderType_v=OrderType_v2[cikl1]; OrderLots_v=volume_v2[cikl1]; OrderComment_v=comment_v2[cikl1]; OrderMagicNumber_v=magic_v2[cikl1]; OrderOpenTime_v=OrderOpenTime_v2[cikl1]; OrderOpenPrice_v=OrderOpenPrice_v2[cikl1]; OrderStopLoss_v=stoploss_v2[cikl1]; OrderTakeProfit_v=takeprofit_v2[cikl1]; OrderCloseTime_v=OrderCloseTime_v2[cikl1]; OrderClosePrice_v=OrderClosePrice_v2[cikl1]; OrderProfit_v=OrderProfit_v2[cikl1]; OrderCommission_v=0; OrderExpiration_v=0; OrderPrint_v="..."; OrderSwap_v=0; POS_slkt=index; } else { OrderTicket_v=0; OrderSymbol_v=NULL; OrderType_v=0; OrderLots_v=0; OrderComment_v=NULL; OrderMagicNumber_v=0; OrderOpenTime_v=0; OrderOpenPrice_v=0; OrderStopLoss_v=0; OrderTakeProfit_v=0; OrderCloseTime_v=0; OrderClosePrice_v=0; OrderProfit_v=0; OrderCommission_v=0; OrderExpiration_v=0; OrderPrint_v=NULL; OrderSwap_v=0; last_error_v=0; return(OrderSlct); } } } if(select==SELECT_BY_TICKET) { for(cikl1=0;cikl1<1000;cikl1++) { if(OrdersTotal_v[TS_number]==0 || cikl1==POS_v1) break; if(ticket_v1[cikl1]==0 || TS_number!=TS_num[cikl1]) continue; if(ticket_v1[cikl1]==index) { OrderSlct=TRUE; break; } } if(OrderSlct) { OrderTicket_v=ticket_v1[cikl1]; OrderSymbol_v=symbol_v1[cikl1]; OrderType_v=OrderType_v1[cikl1]; OrderLots_v=volume_v1[cikl1]; OrderComment_v=comment_v1[cikl1]; OrderMagicNumber_v=magic_v1[cikl1]; OrderOpenTime_v=OrderOpenTime_v1[cikl1]; OrderOpenPrice_v=OrderOpenPrice_v1[cikl1]; OrderStopLoss_v=stoploss_v1[cikl1]; OrderTakeProfit_v=takeprofit_v1[cikl1]; OrderCloseTime_v=0; OrderClosePrice_v=0; OrderProfit_v=OrderProfit_v1[cikl1]; OrderCommission_v=0; OrderExpiration_v=0; OrderPrint_v="..."; OrderSwap_v=0; POS_slkt=cikl1; } else { for(cikl1=0;cikl1<1000;cikl1++) { if(OrdersHistoryTotal_v[TS_number]==0) break; if(ticket_v2[cikl1]==0 || TS_number!=TS_num[cikl1]) continue; if(ticket_v2[cikl1]==index) { OrderSlct=TRUE; break; } } if(OrderSlct) { OrderTicket_v=ticket_v2[cikl1]; OrderSymbol_v=symbol_v2[cikl1]; OrderType_v=OrderType_v2[cikl1]; OrderLots_v=volume_v2[cikl1]; OrderComment_v=comment_v2[cikl1]; OrderMagicNumber_v=magic_v2[cikl1]; OrderOpenTime_v=OrderOpenTime_v2[cikl1]; OrderOpenPrice_v=OrderOpenPrice_v2[cikl1]; OrderStopLoss_v=stoploss_v2[cikl1]; OrderTakeProfit_v=takeprofit_v2[cikl1]; OrderCloseTime_v=OrderCloseTime_v2[cikl1]; OrderClosePrice_v=OrderClosePrice_v2[cikl1]; OrderProfit_v=OrderProfit_v2[cikl1]; OrderCommission_v=0; OrderExpiration_v=0; OrderPrint_v="..."; OrderSwap_v=0; POS_slkt=cikl1; } else { OrderTicket_v=0; OrderSymbol_v=NULL; OrderType_v=0; OrderLots_v=0; OrderComment_v=NULL; OrderMagicNumber_v=0; OrderOpenTime_v=0; OrderOpenPrice_v=0; OrderStopLoss_v=0; OrderTakeProfit_v=0; OrderCloseTime_v=0; OrderClosePrice_v=0; OrderProfit_v=0; OrderCommission_v=0; OrderExpiration_v=0; OrderPrint_v=NULL; OrderSwap_v=0; last_error_v=0; return(OrderSlct); } } } last_error_v=0; return(OrderSlct); } //------------------------------------------------------------------------------------- //-- Ýòó ðàáîòó, ïðè íåîáõîäèìîñòè, ìîæíî åùå äîðîáàòûâàòü è äîðîáàòûâàòü. //+------------------------------------------------------------------+ //| Ôóíêöèÿ îáðàáîòêè îøèáîê | //+------------------------------------------------------------------+ int Fun_Error(int Error) // Ô-èÿ îáðàáîò îøèáîê { switch(Error) { // Ïðåîäîëèìûå îøèáêè case 4: Alert("Òîðãîâûé ñåðâåð çàíÿò. Ïðîáóåì åù¸ ðàç.."); Sleep(3000); // Ïðîñòîå ðåøåíèå return(1); // Âûõîä èç ôóíêöèè case 135:Alert("Öåíà èçìåíèëàñü. Ïðîáóåì åù¸ ðàç.."); RefreshRates(); // Îáíîâèì äàííûå return(1); // Âûõîä èç ôóíêöèè case 136:Alert("Íåò öåí. Æä¸ì íîâûé òèê.."); while(RefreshRates()==false) // Äî íîâîãî òèêà Sleep(1); // Çàäåðæêà â öèêëå return(1); // Âûõîä èç ôóíêöèè case 137:Alert("Áðîêåð çàíÿò. Ïðîáóåì åù¸ ðàç.."); Sleep(3000); // Ïðîñòîå ðåøåíèå return(1); // Âûõîä èç ôóíêöèè case 146:Alert("Ïîäñèñòåìà òîðãîâëè çàíÿòà. Ïðîáóåì åù¸.."); Sleep(500); // Ïðîñòîå ðåøåíèå return(1); // Âûõîä èç ôóíêöèè // Êðèòè÷åñêèå îøèáêè case 2: Alert("Îáùàÿ îøèáêà."); return(0); // Âûõîä èç ôóíêöèè case 5: Alert("Ñòàðàÿ âåðñèÿ òåðìèíàëà."); Work=false; // Áîëüøå íå ðàáîòàòü return(0); // Âûõîä èç ôóíêöèè case 64: Alert("Ñ÷åò çàáëîêèðîâàí."); Work=false; // Áîëüøå íå ðàáîòàòü return(0); // Âûõîä èç ôóíêöèè case 130:Alert("Íåïðàâåëüíûå ñòîïû."); return(0); // Âûõîä èç ôóíêöèè case 133:Alert("Òîðãîâëÿ çàïðåùåíà."); return(0); // Âûõîä èç ôóíêöèè case 134:Alert("Íåäîñòàòî÷íî äåíåã äëÿ ñîâåðøåíèÿ îïåðàöèè."); return(0); // Âûõîä èç ôóíêöèè default: Alert("Âîçíèêëà îøèáêà ",Error); // Äðóãèå âàðèàíòû return(0); // Âûõîä èç ôóíêöèè } if(Error==-10 && Error!=-10) //-- Ïóñòûøêè. ×òîáû íå áûëî ïðåäóïðåæäåíèé ïðè êîìïèëÿöèè êîäà, êîãäà â ìîäåëè èñïîëüçóþòñÿ íå âñå èìåþùèåñÿ ôóíêöèè. { //-- Íèêàãäà íå áóäåò çàïóùåíà òàê êàê ýòî óñëîâèå íå âûïîëíèìî, åñëè ÿ íå îøèáàþñü êîíå÷íî! :-) GetLastError_v(); OrderSelect_v(0, 0, 0); OrderModify_v(0,0,0,0,0,0); OrderCloseBy_v( 0, 0, 0); OrderClose_v(0,0,0,0,0); OrderSend_v(0,0,0,0,0,0,0,0,0,0,0); OrderDelete_v(0,0); OrderSelect_v(0, 0, 0); } } //-------------------------------------------------------------------------------------
Sample
Analysis
Market Information Used:
Series array that contains open prices of each bar
Indicator Curves created:
Indicators Used:
Moving average indicator
Parabolic Stop and Reverse system
Custom Indicators Used:
Order Management characteristics:
It automatically opens orders when conditions are reached
Checks for the total of open orders
Checks for the total of closed orders
Other Features:
Uses files from the file system
It writes information to file
It issuies visual alerts to the screen