//+------------------------------------------------------------------+//| 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 | |
//| 冯-帕夫利乌克 | 冯-帕夫利乌克
//| |
//+------------------------------------------------------------------+
#财产版权"Victor Pavljuk"
#财产版本 "1.03"
输入int TakeProfit=538。
输入int StopLoss=1000。
输入int TradeTime=13。
输入int t1=7。
输入int t2=1。
输入int delta=70。
输入double lot=5。
...
这只适用于出售
购买作品
拿走卖点,问题就从买点开始。
我刚刚开始学习MQL5。
感谢大家的参与。
这只适用于出售
购买作品
把卖的拿走,买的问题就出现了。
我刚刚开始学习MQL5。
感谢大家的参与。
我有一种感觉,帕维尔-斯米尔诺夫的专家顾问已经被拿走了。
你不应该拿它开玩笑!
因此,代码是开放的。
我正在修改它以适应我的系统
在测试过程中,我看到日志中的信息。
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 [无效的请求] 。
感觉帕维尔-斯米尔诺夫议员已经被带走了。
这么多的答案,需要阅读和审查每一个/测试代码 - 上帝保佑,我没有时间,它的评论是什么来的=)
这么多的答案,你必须阅读和审查每一个答案,并测试代码--保证他不会满足时间限制=)