Вы хотите быстро проверить торговую идею, не тратя времени на программирование? Выберите в "Мастере MQL5" нужный тип торговых сигналов, подключите модули сопровождения позиций и управления капиталом - на этом вся работа закончена. Создайте свои реализации модулей или закажите их через сервис "Работа" - и комбинируйте новые модули с уже существующими.
//в тестере баг в режиме мультивалютного тестирования//позиция открывается если на двух инструментах появился новый бар #include <Trade\Trade.mqh>#include <Trade\OrderInfo.mqh>#include <Trade\PositionInfo.mqh>//--- input parametersinputint Per=10;//период средней inputstring Instrum1="EURUSD";//первый инструментinputstring Instrum2="GBPUSD";//второй инструмент//-------------------------------------------------------
CTrade trade;//торговые функции
COrderInfo orderinfo;//информация об ордере
CPositionInfo posinfo;//информация о позицииint hiMA ;//хэндл индикатора intOnInit()
{
hiMA=iMA(_Symbol,_Period,Per,0,MODE_SMA,PRICE_OPEN) ;
if(hiMA < INVALID_HANDLE) return(-1) ;
return(0);
}
//====================================================================voidOnDeinit(constint reason)
{
IndicatorRelease(hiMA) ;
}
//=====================================================================voidOnTick()
{
if(!isNewBar(Instrum2)) return ;
//Print(" Это новый бар ");double Ma[1] ;//показания индикатора CopyBuffer(hiMA,0,0,1,Ma) ;
MqlTick price;// будет использоваться для получения текущих/последних котировок ценыbool possel=posinfo.Select(Instrum1) ;
SymbolInfoTick(Instrum1,price) ;
if(possel && price.bid > Ma[0] && posinfo.PositionType() == POSITION_TYPE_SELL)
{//цена выше средней закрываем короткую позу
trade.PositionClose(Instrum1) ; return ;
}
if( !possel && price.bid > Ma[0])
{//цена выше средней нет поз открываем длинную позу
trade.Buy(0.1,Instrum1,0,0,0,NULL) ; return ;
}
if( possel && price.ask < Ma[0] && posinfo.PositionType() == POSITION_TYPE_BUY)
{//цена ниже средней закрываем длинную позу
trade.PositionClose(Instrum1) ; return ;
}
if(!possel && price.ask < Ma[0])
{// цена ниже средней нет поз открываем короткую позу
trade.Sell(0.1,Instrum1,0,0,0,NULL) ;
}
return ;
}
//=======================================================================bool isNewBar(string other_symbol)
{//возвращает труе если новый бар на двух инструментахstaticdatetime last_bar_time=0;
int cntsleep ;
if(last_bar_time==0)
{//--- это первый вызов, запишем время открытия и выйдем
last_bar_time=(datetime)SeriesInfoInteger(_Symbol,Period(),SERIES_LASTBAR_DATE);
return(false);
}
datetime curr_time=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);
if(curr_time!=last_bar_time)
{//время открытия не совпадает это новый бар
last_bar_time=curr_time;
cntsleep=0 ;
while(!(curr_time == (datetime)SeriesInfoInteger(other_symbol,Period(),SERIES_LASTBAR_DATE)))
{// ждем появления нового бара на втором инструменте Sleep(5000);
if(cntsleep >10) return(false) ;// недождались
cntsleep++ ;
}
return(true) ;
}
return(false) ;
}
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
这里有一段代码。如何使参数input int grusdchf=100; input int grusdjpy=100;trpar2=false 时不被优化?
//------------------------------------------------------------inputbool trpar1=true ;//разрешение торговли по EURUDSDinputint greurusd=100;//сетка для EURUSDinputint grgbpusd=100;//сетка для GBPUSD//------------------------------------------------------------inputbool trpar2=true;//inputint grusdchf=100;//inputint grusdjpy=100;////------------------------------------------------------------inputbool trpar3=true;//inputint graudjpy=100;//inputint grchfjpy=100;//
这里有一段代码。如何使参数input int grusdchf=100; input int grusdjpy=100;trpar2=false 时不被优化?
inputbool trpar2=true;
inputint grusdchf=100;
inputint grusdjpy=100;
if (trpair2==false) // если false то всегда 100
{
x_grusdchf=100;
x_grusdjpy=100;
}
else// если true то значения с перебора
{
x_grusdchf=grusdchf;
x_grusdjpy=grusdjpy;
}
为什么当我按下 "开始 "按钮时,测试器不从最初的存款水平开始测试,而是从上次测试结束的水平开始。4中没有这样的问题。如何从初始存款水平开始测试?
我们无法重现你描述的情况。
让我们给出更多细节
我们无法重现你描述的情况。
给我们更多的细节
这似乎是一个错误。
在多币种测试模式下,当等待两个工具上出现一个新的条形图 时,测试者的行为不正确。
稍微澄清一下。在isNewBar函数中,当主符号上出现一个新条形时,我们在循环中等待另一个符号上出现新条形。
我正在粘贴代码。
这似乎是一个错误。
在多币种测试模式下,当等待两个工具上出现一个新的条形图 时,测试者的行为不正确。
你到底认为什么是错误,请解释。你没有提供任何关于测试的细节,或获得的结果,或预期的结果。
此外,我想提请您注意MetaTrader 5中的测试基础知识。它解释了蜱虫的产生机制和基本概念。
你到底认为什么是错误,请解释。你没有提供任何测试的细节或你得到的结果,你也不知道预期的结果。
此外,我想提请您注意MetaTrader 5中的测试基础知识。它解释了蜱虫的产生机制和基本概念。
这很容易。
我们启动专家顾问进行优化,看看结果。
例如,我们选择第4个通道,运行专家顾问,并获得其所有交易的正常运行 - 这是报告。
我有一种感觉。在多币种优化模式下,如果交易不是在开盘时开出的,测试员就不能将其绑定在条形图上。
如果isNewBar函数注释了循环,并且不等待另一个符号上的新条形出现,那么一切都会正常。终端机版本5 build 642。
我已经阅读了这些文章,并从那里阅读了代码。虽然,我知道我自己,我可能要重读它们。
节日快乐。
我在向导中生成了一个 带有抛物线止损的中型EA。我在开放的价格上运行一个测试,然后点击 "取消"。我第二次运行它,得到了上述情况(余额和权益图没有重新绘制,而是继续)。不是来自向导的专家顾问是可以的。
创建一个Servicedesk应用程序,指定
这里有一段代码。如何使参数input int grusdchf=100; input int grusdjpy=100;trpar2=false 时不被优化?
这里有一段代码。如何使参数input int grusdchf=100; input int grusdjpy=100;trpar2=false 时不被优化?
不要在测试器中针对这些参数勾选复选框。或者澄清这个问题,否则我认为有歧义。:)
问题。
你需要向一个函数传递一个对象指针的数组。当然,是通过引用(一个数组)。
使用什么语法?
或者我应该以其他方式使用它?
这里有一段代码。如何使参数input int grusdchf=100; input int grusdjpy=100;trpar2=false 时不被优化?