//+------------------------------------------------------------------+ //| TradeContext.mq4 | //| Copyright © 2006, komposter | //| mailto:komposterius@mail.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, komposter" #property link "mailto:komposterius@mail.ru" ///////////////////////////////////////////////////////////////////////////////// /**/ int _IsTradeAllowed( int MaxWaiting_sec = 30 ) ///////////////////////////////////////////////////////////////////////////////// // ôóíêöèÿ îïðåäåëÿåò ñîñòîÿíèå òîðãîâîãî ïîòîêà. Êîäû âîçâðàòîâ: // 1 - òîðãîâûé ïîòîê ñâîáîäåí, ìîæíî òîðãîâàòü // 0 - òîðãîâûé ïîòîê áûë çàíÿò, íî îñâîáîäèëñÿ. Òîðãîâàòü ìîæíî òîëüêî ïîñëå îáíîâëåíèÿ ðûíî÷íîé èíôîðìàöèè. // -1 - òîðãîâûé ïîòîê çàíÿò, îæèäàíèå ïðåðâàíî ïîëüçîâàòåëåì (ýêñïåðò óäàë¸í ñ ãðàôèêà, çàêðûò òåðìèíàë, èçìåíèëñÿ // ïåðèîä è/èëè ñèìâîë ãðàôèêà, ... ) // -2 - òîðãîâûé ïîòîê çàíÿò, èñòåêëî ìàêñèìàëüíîå âðåìÿ îæèäàíèÿ (MaxWaiting_sec). Âîçìîæíî, ýêñïåðòó çàïðåùåíà // òîðãîâëÿ (ãàëî÷êà "Ðàçðåøèòü ýêñïåðòó òîðãîâàòü" â íàñòðîéêàõ ýêñïåðòà). // // MaxWaiting_sec - âðåìÿ (â ñåêóíäàõ), â òå÷åíèè êîòîðîãî ôóíêöèÿ áóäåò æäàòü îñâîáîæäåíèÿ òîðãîâîãî ïîòîêà (åñëè îí // çàíÿò). Ïî óìîë÷àíèþ = 30. ///////////////////////////////////////////////////////////////////////////////// { // ïðîâåðÿåì, ñâîáîäåí ëè òîðãîâûé ïîòîê if ( !IsTradeAllowed() ) { int StartWaitingTime = GetTickCount(); Print( "Òîðãîâûé ïîòîê çàíÿò! Æä¸ì, ïîêà îí îñâîáîäèòüñÿ..." ); // áåñêîíå÷íûé öèêë while ( true ) { // åñëè ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì, ïðåêðàùàåì ðàáîòó if ( IsStopped() ) { Print( "Ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì!" ); return(-1); } // åñëè îæèäàíèå äëèòñÿ äîëüøå âðåìåíè, óêàçàííîãî â ïåðåìåííîé MaxWaiting_sec, òîæå ïðåêðàùàåì ðàáîòó if ( GetTickCount() - StartWaitingTime > MaxWaiting_sec * 1000 ) { Print( "Ïðåâûøåí ëèìèò îæèäàíèÿ (" + MaxWaiting_sec + " ñåê.)!" ); return(-2); } // åñëè òîðãîâûé ïîòîê îñâîáîäèëñÿ, if ( IsTradeAllowed() ) { Print( "Òîðãîâûé ïîòîê îñâîáîäèëñÿ!" ); return(0); } // åñëè íè îäíî èç óñëîâèé îñòàíîâêè öèêëà íå ñðàáîòàëî, "æä¸ì" 0,1 ñåêóíäû è íà÷èíàåì ïðîâåðêó ñíà÷àëà Sleep(100); } } else { Print( "Òîðãîâûé ïîòîê ñâîáîäåí!" ); return(1); } } /* Øàáëîí ýêñïåðòà, èñïîëüçóþùåãî ôóíêöèþ _IsTradeAllowed: int start() { // îïðåäåëÿåì íåîáõîäèìîñòü âõîäà â ðûíîê ... // ðàñ÷èòûâàåì óðîâíè Ñòîï Ëîññ, Òåéê Ïðîôèò è ðàçìåð ëîòà ... // ïðîâåðÿåì, ñâîáîäåí ëè òîðãîâûé ïîòîê int TradeAllow = _IsTradeAllowed(); if ( TradeAllow < 0 ) { return(-1); } if ( TradeAllow == 0 ) { RefreshRates(); // ïåðåñ÷èòûâàåì óðîâíè Ñòîï Ëîññ è Òåéê Ïðîôèò ... } // îòêðûâàåì ïîçèöèþ OrderSend(.....); return(0); } */ ///////////////////////////////////////////////////////////////////////////////// /**/ int TradeIsBusy ( int MaxWaiting_sec = 30 ) ///////////////////////////////////////////////////////////////////////////////// // Ôóíêöèÿ ìåíÿåò çíà÷åíèå ãëîáàëüíîé ïåðåìåííîé TradeIsBusy ñ 0 íà 1. // Åñëè â ìîìåíò çàïóñêà TradeIsBusy = 1, ôóíêöèÿ æä¸ò, ïîêà TradeIsBusy ñòàíåò = 0, è òîëüêî ïîòîì ìåíÿåò. // Åñëè ãëîáàëüíîé ïåðåìåííîé TradeIsBusy íå ñóùåñòâóåò, ôóíêöèÿ ñîçäà¸ò å¸. // Êîäû âîçâðàòîâ: // 1 - óñïåøíîå çàâåðøåíèå. Ãëîáàëüíîé ïåðåìåííîé TradeIsBusy ïðèñâîåíî çíà÷åíèå 1 // -1 - â ìîìåíò çàïóñêà ôóíêöèè TradeIsBusy = 1, îæèäàíèå áûëî ïðåðâàíî ïîëüçîâàòåëåì (ýêñïåðò óäàë¸í ñ ãðàôèêà, çàêðûò // òåðìèíàë, èçìåíèëñÿ ïåðèîä è/èëè ñèìâîë ãðàôèêà, ... ) // -2 - â ìîìåíò çàïóñêà ôóíêöèè TradeIsBusy = 1, èñòåêëî ìàêñèìàëüíîå âðåìÿ îæèäàíèÿ (MaxWaiting_sec) ///////////////////////////////////////////////////////////////////////////////// { // ïðè òåñòèðîâàíèè íåò ñìûñëà â ðàçäåëåíèè òîðãîâîãî ïîòîêà - ïðîñòî çàâåðøàåì ðàáîòó ôóíêöèè if ( IsTesting() ) { return(1); } int _GetLastError = 0, StartWaitingTime = GetTickCount(); //+------------------------------------------------------------------+ //| Ïðîâåðÿåì, ñóùåñòâóåò ëè ãë. ïåðåìåííàÿ è, åñëè íåò, ñîçäà¸ì å¸ //+------------------------------------------------------------------+ while( true ) { // åñëè ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì, ïðåêðàùàåì ðàáîòó if ( IsStopped() ) { Print( "Ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì!" ); return(-1); } // åñëè îæèäàíèå äëèòñÿ äîëüøå âðåìåíè, óêàçàííîãî â ïåðåìåííîé MaxWaiting_sec, òîæå ïðåêðàùàåì ðàáîòó if ( GetTickCount() - StartWaitingTime > MaxWaiting_sec * 1000 ) { Print( "Ïðåâûøåí ëèìèò îæèäàíèÿ (" + MaxWaiting_sec + " ñåê.)!" ); return(-2); } // ïðîâåðÿåì, ñóùåñòâóåò ëè ãë. ïåðåìåííàÿ if ( GlobalVariableCheck( "TradeIsBusy" ) ) // åñëè îíà åñòü, âûõîäèì èç ýòîãî öèêëà è ïåðåõîäèì ê áëîêó èçìåíåíèÿ çíà÷åíèÿ TradeIsBusy { break; } else // åñëè GlobalVariableCheck âåðíóëà FALSE, çíà÷èò ëèáî ïåðåìåííîé íåò, ëèáî ïðè ïðîâåðêå âîçíèêëà îøèáêà { _GetLastError = GetLastError(); // åñëè ýòî âñ¸ òàêè îøèáêà, âûâîäèì èíôîðìàöèþ, æä¸ì 0,1 ñåêóíäû è íà÷èíàåì ïðîâåðêó ñíà÷àëà if ( _GetLastError != 0 ) { Print( "TradeIsBusy() - GlobalVariableCheck ( \"TradeIsBusy\" ) - Error #", _GetLastError ); Sleep(100); continue; } } // åñëè îøèáêè íåò, çíà÷èò ãëîáàëüíîé ïåðåìåííîé ïðîñòî íåò, ïûòàåìñÿ ñîçäàòü å¸ if ( GlobalVariableSet ( "TradeIsBusy", 1.0 ) > 0 ) // åñëè GlobalVariableSet > 0, çíà÷èò ãëîáàëüíàÿ ïåðåìåííàÿ óñïåøíî ñîçäàíà. Âûõîäèì èç ô-öèè { return(1); } else // åñëè GlobalVariableSet âåðíóëà çíà÷åíèå <= 0, çíà÷èò ïðè ñîçäàíèè ïåðåìåííîé âîçíèêëà îøèáêà { _GetLastError = GetLastError(); // âûâîäèì èíôîðìàöèþ, æä¸ì 0,1 ñåêóíäû è íà÷èíàåì ïîïûòêó ñíà÷àëà if ( _GetLastError != 0 ) { Print( "TradeIsBusy() - GlobalVariableSet ( \"TradeIsBusy\", 0.0 ) - Error #", _GetLastError ); Sleep(100); continue; } } } //+------------------------------------------------------------------+ //| Åñëè âûïîëíåíèå ôóíêöèè äîøëî äî ýòîãî ìåñòà, çíà÷èò ãëîáàëüíàÿ ïåðåìåííàÿ ñóùåñòâóåò. //| Æä¸ì, ïîêà TradeIsBusy ñòàíåò = 0 è ìåíÿåì çíà÷åíèå TradeIsBusy ñ 0 íà 1 //+------------------------------------------------------------------+ while( true ) { // åñëè ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì, ïðåêðàùàåì ðàáîòó if ( IsStopped() ) { Print( "Ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì!" ); return(-1); } // åñëè îæèäàíèå äëèòñÿ äîëüøå âðåìåíè, óêàçàííîãî â ïåðåìåííîé MaxWaiting_sec, òîæå ïðåêðàùàåì ðàáîòó if ( GetTickCount() - StartWaitingTime > MaxWaiting_sec * 1000 ) { Print( "Ïðåâûøåí ëèìèò îæèäàíèÿ (" + MaxWaiting_sec + " ñåê.)!" ); return(-2); } // ïûòàåìñÿ ìåíÿòü çíà÷åíèå TradeIsBusy ñ 0 íà 1 if ( GlobalVariableSetOnCondition( "TradeIsBusy", 1.0, 0.0 ) ) // åñëè íàì ýòî óäà¸òñÿ, âûõîäèì èç ô-öèè, âîçâðàùàÿ 1 - "óñïåøíîå çàâåðøåíèå" { return(1); } else // åñëè íåò, âîçìîæíû 2 ïðè÷èíû: TradeIsBusy = 1 (òîãäà íàäî æäàòü), ëèáî âîçíèêëà îøèáêà (ýòî ìû è ïðîâåðèì) { _GetLastError = GetLastError(); // åñëè ýòî âñ¸ òàêè îøèáêà, âûâîäèì èíôîðìàöèþ è ïðîáóåì åù¸ ðàç if ( _GetLastError != 0 ) { Print( "TradeIsBusy() - GlobalVariableSetOnCondition ( \"TradeIsBusy\", 1.0, 0.0 ) - Error #", _GetLastError ); continue; } } // åñëè îøèáêè íåò, çíà÷èò TradeIsBusy = 1 (äðóãîé ýêñïåðò òîðãóåò) - âûâîäèì èíôîðìàöèþ è æä¸ì... Comment ( "Æä¸ì, ïîêà äðóãîé ýêñïåðò çàêîí÷èò òîðãîâàòü..." ); Sleep(1000); } } ///////////////////////////////////////////////////////////////////////////////// /**/ void TradeIsNotBusy () ///////////////////////////////////////////////////////////////////////////////// // Ôóíêöèÿ óñòàíàâëèâàåò çíà÷åíèå ãëîáàëüíîé ïåðåìåííîé TradeIsBusy = 0. // Åñëè ãëîáàëüíîé ïåðåìåííîé TradeIsBusy íå ñóùåñòâóåò, ôóíêöèÿ ñîçäà¸ò å¸. ///////////////////////////////////////////////////////////////////////////////// { // ïðè òåñòèðîâàíèè íåò ñìûñëà â ðàçäåëåíèè òîðãîâîãî ïîòîêà - ïðîñòî çàâåðøàåì ðàáîòó ôóíêöèè if ( IsTesting() ) { return(0); } int _GetLastError; while( true ) { // åñëè ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì, ïðåêðàùàåì ðàáîòó if ( IsStopped() ) { Print( "Ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì!" ); return(-1); } // ïûòàåìñÿ óñòàíîâèòü çíà÷åíèå ãë. ïåðåìåííîé = 0 (èëè ñîçäàòü ãë. ïåðåìåííóþ) if ( GlobalVariableSet( "TradeIsBusy", 0.0 ) > 0 ) // åñëè GlobalVariableSet âåðíóëà çíà÷åíèå > 0, çíà÷èò âñ¸ çàêîí÷èëîñü õîðîøî. Âûõîäèì èç ô-öèè { return(1); } else // åñëè GlobalVariableSet âåðíóëà çíà÷åíèå <= 0, çíà÷èò âîçíèêëà îøèáêà. Âûâîäèì èíôîðìàöèþ, æä¸ì, è ïðîáóåì åù¸ ðàç { _GetLastError = GetLastError(); if ( _GetLastError != 0 ) { Print( "TradeIsNotBusy() - GlobalVariableSet ( \"TradeIsBusy\", 0.0 ) - Error #", _GetLastError ); } } Sleep(100); } } /* Øàáëîí ýêñïåðòà, èñïîëüçóþùåãî ôóíêöèè TradeIsBusy() è TradeIsNotBusy(): #include <TradeContext.mqh> int start() { // îïðåäåëÿåì íåîáõîäèìîñòü âõîäà â ðûíîê ... // ðàñ÷èòûâàåì óðîâíè Ñòîï Ëîññ, Òåéê Ïðîôèò è ðàçìåð ëîòà ... // æä¸ì îñâîáîæäåíèÿ òîðãîâîãî ïîòîêà è çàíèìàåì åãî (åñëè ïðîèçîøëà îøèáêà, âûõîäèì) if ( TradeIsBusy() < 0 ) { return(-1); } // îáíîâëÿåì ðûíî÷íóþ èíôîðìàöèþ RefreshRates(); // ïåðåñ÷èòûâàåì óðîâíè Ñòîï Ëîññ è Òåéê Ïðîôèò ... // îòêðûâàåì ïîçèöèþ OrderSend(.....); // îñâîáîæäàåì òîðãîâûé ïîòîê TradeIsNotBusy(); return(0); } */
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
It automatically opens orders when conditions are reached
Other Features: