//+------------------------------------------------------------------+//| 20_200_pips_MQL5_v1.mq5 |//| Copyright 2010, Смирнов Павел |//| http://www.autoforex.ru |//+------------------------------------------------------------------+#property copyright "Copyright 2010, Смирнов Павел"#property link "http://www.autoforex.ru"#property version "1.00"//--- объявляем внешние переменные. //--- они будут доступны извне и их значения можно будет менять перед запуском тестераinputint TakeProfit= 200 ;
inputint StopLoss= 2000 ;
inputint TradeTime= 18 ;
inputint t1= 7 ;
inputint t2= 2 ;
inputint delta= 70 ;
inputdouble lot= 0.1 ;
bool cantrade= true ; // флаг для разрешения или запрета торговли.double Ask; // здесь будем хранить цену Ask для нового тика (так удобней)double Bid; // здесь будем хранить цену Bid для нового тика (так удобней)//+------------------------------------------------------------------+//| Функция открытия длинной (Long) позиции. |//| Указываем также значения переменных по умолчанию |//+------------------------------------------------------------------+int OpenLong( double volume= 0.1 ,
int slippage= 10 ,
string comment= "EUR/USD 20 pips expert (Long)" ,
int magic= 0 )
{
//--- объявляем структуру типа MqlTradeRequest для формирования запросаMqlTradeRequest my_trade;
//--- в этой структуре будет ответ сервера на запрос.MqlTradeResult my_trade_result;
ZeroMemory (my_trade);
//---- далее заполняеем все НЕОБХОДИМЫЕ поля структуры запроса.//---- установить торговый ордер на немедленное совершение сделки с указанными параметрами (поставить рыночный ордер)
my_trade.action= TRADE_ACTION_DEAL ;
//--- указываем в качестве валютной пары - текущую валютную пару (ту, на которой запущен советник)
my_trade.symbol= Symbol ();
//--- размер лота
my_trade.volume= NormalizeDouble (volume, 1 );
//--- цена, при достижении которой ордер должен быть исполнен. //--- в нашем случае для TRADE_ACTION_DEAL это текущая цена и ее, согласно инструкции указывать не обязательно.
my_trade.price= NormalizeDouble (Ask, _Digits );
//--- стоплосс ордера (цена при которой следует закрыть убыточную сделку)
my_trade.sl= NormalizeDouble (Ask-StopLoss* _Point , _Digits );
//--- тейкпрофит (цена при которой следует закрыть прибыльную сделку)
my_trade.tp= NormalizeDouble (Ask+TakeProfit* _Point , _Digits );
//--- проскальзывание в пунктах (при тестировании особой роли не играет, т.к. проскальзывания не бывает на тестах)
my_trade.deviation=slippage;
//--- тип рыночного ордера (покупаем)
my_trade.type= ORDER_TYPE_BUY ;
//--- указываем как исполнять ордер. (All Or Nothing - все или ничего) //--- сделка может быть совершена исключительно в указанном объеме и по цене равной или лучше указанной в ордере.
my_trade.type_filling= ORDER_FILLING_FOK ;
//--- комментарий ордера
my_trade.comment=comment;
//--- магическое число ордера
my_trade.magic=magic;
//--- обнуляем код последней ошибки ResetLastError ();
//--- отправляем запрос на открытие позиции. При этом проверяем успешно ли прошла отправка запросаif ( OrderSend (my_trade,my_trade_result))
{
//--- если сервер принял ордер то смортрим на результат Print ( "Код результата операции - " ,my_trade_result.retcode);
}
else
{
//--- сервер не принял ордер в нем есть ошибки, выводим их в журналPrint ( "Код результата операции - " ,my_trade_result.retcode);
Print ( "Ошибка открытия ордера = " , GetLastError ());
}
//--- выходим из функции открытия ордера return ( 0 );
}
//+------------------------------------------------------------------+//| функция открытия короткой (Short) позиции. |//| Аналогична функции открытия длинной позиции. |//+------------------------------------------------------------------+int OpenShort( double volume= 0.1 ,
int slippage= 10 ,
string comment= "EUR/USD 20 pips expert (Short)" ,
int magic= 0 )
{
MqlTradeRequest my_trade;
MqlTradeResult my_trade_result;
ZeroMemory (my_trade);
my_trade.action= TRADE_ACTION_DEAL ;
my_trade.symbol= Symbol ();
my_trade.volume= NormalizeDouble (volume, 1 );
my_trade.price= NormalizeDouble (Bid, _Digits );
my_trade.sl= NormalizeDouble (Bid+StopLoss* _Point , _Digits );
my_trade.tp= NormalizeDouble (Bid-TakeProfit* _Point , _Digits );
my_trade.deviation=slippage;
my_trade.type= ORDER_TYPE_SELL ;
my_trade.type_filling= ORDER_FILLING_FOK ;
my_trade.comment=comment;
my_trade.magic=magic;
ResetLastError ();
if ( OrderSend (my_trade,my_trade_result))
{
Print ( "Код результата операции - " ,my_trade_result.retcode);
}
else
{
Print ( "Код результата операции - " ,my_trade_result.retcode);
Print ( "Ошибка открытия ордера = " , GetLastError ());
}
return ( 0 );
}
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit ()
{
return ( 0 );
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit ( constint reason){}
//+------------------------------------------------------------------+//| Expert OnTick function |//+------------------------------------------------------------------+voidOnTick ()
{
//--- массив где будут храниться цены открытия баров (включая Open[t1] и Open[t2])double Open[];
//--- в этой структуре храним текущее время.MqlDateTime mqldt;
//--- обновляем данные о текущем времени.TimeCurrent (mqldt);
//--- переменная определяющая длину массива Open[].int len;
//---здесь будут храниться цены последнего пришедшего тикаMqlTick last_tick;
//--- заполняем структуру last_tick последними ценами текущего символа.SymbolInfoTick ( _Symbol ,last_tick);
//--- обновляем переменные Ask и Bid для дальнейшего использования
Ask=last_tick.ask;
Bid=last_tick.bid;
//---для удобства работы определяем массив Open[] как таймсерию.ArraySetAsSeries (Open, true );
//--- далее определим длину массива такую, чтобы обязательно вошли значения Open[t1] и Open[t2]//--- t1 и t2 - номера баров на которых сравниваются цены. //--- Берем большее из них и добавляем 1 (т.к. есть еще и нулевой бар)if (t1>=t2)len=t1+ 1 ;
else len=t2+ 1 ;
//--- заполняем массив Open[] актуальными значениямиCopyOpen ( _Symbol , PERIOD_H1 , 0 ,len,Open);
//--- переключаем флаг cantarde на true, т.е. разрешим советнику снова открывать позицииif (((mqldt.hour)>TradeTime)) cantrade= true ;
//--- проверяем возможность встать в позицию:if (! PositionSelect ( _Symbol )) // Если еще нет открытой позиции
{
//--- если пришло время торговатьif ((mqldt.hour==TradeTime) && (cantrade))
{
//--- проверяем условие для открытия короткой сделки (продажи)if (Open[t1]>(Open[t2]+delta* _Point ))
{
//--- открываем позицию Short
OpenShort(lot, 10 , "EUR/USD 20 pips expert (Short)" , 1234 );
//--- переключаем флаг (запрещаем торговать), чтобы не открывал больше позиций до следующего дня
cantrade= false ;
//--- выходимreturn ;
}
//--- проверяем условие для открытия длинной позиции (покупки)if ((Open[t1]+delta* _Point )<Open[t2])
{
//--- открываем позицию Long
OpenLong(lot, 10 , "EUR/USD 20 pips expert (Long)" , 1234 );
//--- переключаем флаг (запрещаем торговать), чтобы не открывал больше позиций до следующего дня
cantrade= false ;
//--- выходимreturn ;
}
}
}
return ;
}
//+------------------------------------------------------------------+
누가 도울 수 있습니까? 어디에 오류가 있는지 모르겠습니다. 테스트를 통과하지 못합니다.
코드:
//+----------------------------------------------- --------------------+
//| Cempionat2012.mq5 |
//| 빅터 파블류크 |
//| |
//+----------------------------------------------- --------------------+
#property copyright "Victor Pavljuk"
#속성 버전 "1.03"
입력 int TakeProfit=538;
입력 int StopLoss=1000;
입력 int TradeTime=13;
입력 정수 t1=7;
입력 정수 t2=1;
입력 정수 델타 = 70;
입력 더블 로트=5;
...
이것은 판매에만 있습니다
일을 사다
판매 제거, 구매 문제 시작
저는 이제 막 MQL5를 이해하기 시작했습니다.
참여해주셔서 감사합니다.
이것은 판매에만 있습니다
일을 사다
판매 제거, 구매 문제 시작
저는 이제 막 MQL5를 이해하기 시작했습니다.
참여해주셔서 감사합니다.
Pavel Smirnov의 고문이 데려간 것 같습니다.
농담하는 거 아니야!
그래서 코드가 열려있다
내 시스템에 맞게 수정
테스트하는 동안 로그에 메시지를 생성합니다.
2012.09.21 20:07:11 코어 1 2012.09.18 13:00:00 인스턴트 판매 실패 5.00 EURUSD at 1.30657 sl: 1.29657 tp: 1.31195 [잘못된 요청]
Pavel Smirnov의 고문이 데려간 것 같습니다.
답변이 너무 많기 때문에 모든 사람이 코드를 읽고 확인/테스트해야 합니다. 제 시간에 맞지 않는 것은 금합니다. 주석과 함께 제공되는 내용 =)
답변이 너무 많기 때문에 모든 사람이 코드를 읽고 검토/테스트해야 합니다. 시간을 맞추지 못할 것임을 보장합니다 =)