//+------------------------------------------------------------------+ //| AlexmanConcursExpert.mq4 | //| Copyright © 2006, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #define copyright "Copyright © 2006, AlexMan Studio" #define link "mailto:alexgomel@tut.by" #import "AlexConcursLibrary.ex4" //Íåêîòîðûå ôóíêöèè äëÿ ðàáîòû ýêñïåðòà // double StopValue(int i); bool IsByeTrade(int i); bool IsSellTrade(int i); bool IsStopByeTrade(int i); bool IsStopSellTrade(int i); double EmaStop(int PeriodEMA, int i); #import //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- GlobalVariableSet( "AlexmanConcursExpert", 0); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } extern int _MagicNumber = 1440; // Óíèêàëüíûé ìàãè÷åñêèé íîìåð îðäåðà extern int PeriodEMA = 15; // Ïåðèîä ÅÌÀ äëÿ ðàñ÷åòà ñòîï-ëîñà extern int Zazor = 7; // áóôôåðíûé çàïàñ íà ñòîï-ëîññ // Òàê êàê ïî óñëîâèÿì êîíêóðñà âêëþ÷àåìûå ôàéëû íå ðàçðåøåíû, èñïîëüçóåìûé ôàéë // OneOrderControl.mq4 âñòàâëåí â òåëî ýêñïåðòà íåïîñðåäñòâåííî. // Ñïàñèáî çà ñèñòåìó óïðàâëåíèÿ îðäåðàìè Àíäðåþ Õàòèìëÿíñêîìó! //+------------------------------------------------------------------+ //| OneOrderControl.mq4 | //| Copyright © 2006, komposter | //| mailto:komposterius@mail.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, komposter" #property link "mailto:komposterius@mail.ru" int _Ticket = 0, _Type = 0; double _Lots = 0.0, _OpenPrice = 0.0, _StopLoss = 0.0; double _TakeProfit = 0.0; datetime _OpenTime = -1; double _Profit = 0.0, _Swap = 0.0; double _Commission = 0.0; string _Comment = ""; datetime _Expiration = -1; void OneOrderInit( int magic ) { int _GetLastError, _OrdersTotal = OrdersTotal(); _Ticket = 0; _Type = 0; _Lots = 0.0; _OpenPrice = 0.0; _StopLoss = 0.0; _TakeProfit = 0.0; _OpenTime = -1; _Profit = 0.0; _Swap = 0.0; _Commission = 0.0; _Comment = ""; _Expiration = -1; for ( int z = _OrdersTotal - 1; z >= 0; z -- ) { if ( !OrderSelect( z, SELECT_BY_POS ) ) { _GetLastError = GetLastError(); Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError ); continue; } if ( OrderMagicNumber() == magic && OrderSymbol() == Symbol() ) { _Ticket = OrderTicket(); _Type = OrderType(); _Lots = NormalizeDouble( OrderLots(), 1 ); _OpenPrice = NormalizeDouble( OrderOpenPrice(), Digits ); _StopLoss = NormalizeDouble( OrderStopLoss(), Digits ); _TakeProfit = NormalizeDouble( OrderTakeProfit(), Digits ); _OpenTime = OrderOpenTime(); _Profit = NormalizeDouble( OrderProfit(), 2 ); _Swap = NormalizeDouble( OrderSwap(), 2 ); _Commission = NormalizeDouble( OrderCommission(), 2 ); _Comment = OrderComment(); _Expiration = OrderExpiration(); return(0); } } } int Shift=1; int start() { // if (CurTime() < D'2006.07.01 00:00') return(0); int _GetLastError = 0; double spraid = Ask-Bid; double EmaStopValue = EmaStop(PeriodEMA,Shift); // âûíåñ â ïåðåìåííóþ äëÿ ðàçãðóçêè ïðîöà //---- Çàïîìèíàåì ïàðàìåòðû îòêðûòîé ïîçèöèè (åñëè îíà åñòü) OneOrderInit( _MagicNumber ); //---- À òåïåðü ñìîòðèì, åñòü ëè îòêðûòàÿ ïîçèöèÿ: if ( _Ticket > 0 ) { //---- åñëè îòêðûòà ÁÀÉ-ïîçèöèÿ, if ( _Type == OP_BUY ) { //---- åñëè ee çàêðûâàòü, if ( IsStopByeTrade(Shift) ) { //---- çàêðûâàåì ïîçèöèþ if ( !OrderClose( _Ticket, _Lots, Bid, 5, Green ) ) { _GetLastError = GetLastError(); Print( "Îøèáêà OrderClose ¹ ", _GetLastError ); return(-1); } } //---- åñëè ñèãíàë íå èçìåíèëñÿ, âûõîäèì - ïîêà ðàíî îòêðûâàòü íîâóþ ïîçèöèþ else { // êñòàòè, ìîæåò ïîðà äâèãàòü ñòîï-ëîññ? if ((_StopLoss==0 || _StopLoss < (EmaStopValue-(Zazor+5)*Point )) && (EmaStopValue-Zazor*Point ) < Bid) { if (!OrderModify(_Ticket,_OpenPrice,EmaStopValue-Zazor*Point,_TakeProfit,0,Blue)) { _GetLastError = GetLastError(); Print( "Îøèáêà -0- OrderModify ¹ ", _GetLastError ); return(-1); } GlobalVariableSet( "AlexmanConcursExpert", 1); } if ((_StopLoss==0 || _StopLoss < _OpenPrice) && _Profit>500 ) { if (!OrderModify(_Ticket,_OpenPrice,_OpenPrice,_TakeProfit,0,Blue)) { _GetLastError = GetLastError(); Print( "Îøèáêà OrderModify ¹ ", _GetLastError ); return(-1); } GlobalVariableSet( "AlexmanConcursExpert", 1); } return(0); } } //---- åñëè îòêðûòà ÑÅËË-ïîçèöèÿ, if ( _Type == OP_SELL ) { //---- åñëè åå çàêðûâàòü, if ( IsStopSellTrade(Shift) ) { //---- çàêðûâàåì ïîçèöèþ if ( !OrderClose( _Ticket, _Lots, Ask, 5, Red ) ) { _GetLastError = GetLastError(); Print( "Îøèáêà OrderClose ¹ ", _GetLastError ); return(-1); } } //---- åñëè ñèãíàë íå èçìåíèëñÿ, âûõîäèì - ïîêà ðàíî îòêðûâàòü íîâóþ ïîçèöèþ else { // êñòàòè, ìîæåò ïîðà äâèãàòü ñòîï-ëîññ? if ((_StopLoss==0 || _StopLoss > (EmaStopValue+spraid+(Zazor+5)*Point )) && (EmaStopValue+Zazor*Point ) > Bid) { if (!OrderModify(_Ticket,_OpenPrice,EmaStopValue+spraid+Zazor*Point,_TakeProfit,0,Blue)) { _GetLastError = GetLastError(); Print( "Îøèáêà -1- OrderModify ¹ ", _GetLastError ); return(-1); } GlobalVariableSet( "AlexmanConcursExpert", 1); } if ((_StopLoss==0 || _StopLoss > _OpenPrice) && _Profit>500 ) { if (!OrderModify(_Ticket,_OpenPrice,_OpenPrice,_TakeProfit,0,Blue)) { _GetLastError = GetLastError(); Print( "Îøèáêà OrderModify ¹ ", _GetLastError ); return(-1); } GlobalVariableSet( "AlexmanConcursExpert", 1); } return(0); } } } //---- åñëè íåò ïîçèöèè, îòêðûòîé ýêñïåðòîì ( _Ticket == 0 ) //- òîðãóåì òîëüêî åñëè êîí÷èëñÿ ñòàðûé ñèãíàë if ((IsByeTrade(Shift+5) && IsStopByeTrade(Shift)) || (IsSellTrade(Shift+5) && IsStopSellTrade(Shift)) ) GlobalVariableSet( "AlexmanConcursExpert", 0); //-- Îòäûõàåì, åñëè â ýòîò ÷àñ ñðàáîòàë ñòîïëîññ if(GlobalVariableGet("AlexmanConcursExpert") ==1) return(0); //---- Íåïëîõî áû îòêðûòü ïîçèöèþ, íàïðèìåð êóïèòü if ( IsByeTrade(Shift) && EmaStopValue<=Low[Shift] && EmaStopValue < Bid) { //---- îòêðûâàåì ÁÀÉ ïîçèöèþ if ( OrderSend( Symbol(), OP_BUY, 1.0, Ask, 5, 0.0, 0.0, "by AlexmanConcursExpert.mq4", _MagicNumber, 0, Green ) < 0 ) { _GetLastError = GetLastError(); Print( "Îøèáêà OrderSend ¹ ", _GetLastError ); return(-1); } return(0); } //---- Èëè ìîæåò ïðîäàòü?, if ( IsSellTrade(Shift) && EmaStopValue>=High[Shift] && EmaStopValue> Ask) { //---- îòêðûâàåì ÑÅËË ïîçèöèþ if ( OrderSend( Symbol(), OP_SELL, 1.0, Bid, 5, 0.0, 0.0, "by AlexmanConcursExpert.mq4", _MagicNumber, 0, Red ) < 0 ) { _GetLastError = GetLastError(); Print( "Îøèáêà OrderSend ¹ ", _GetLastError ); return(-1); } return(0); } return(0); }
Sample
Analysis
Market Information Used:
Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
AlexConcursLibrary
Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy
Other Features: