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