Matrix_v1.31





//+----------------------------------------------------------------------------+
//|  Àâòîð    : Áîðèñ Ñåäîâ                                                    |
//|  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