Вы хотите быстро проверить торговую идею, не тратя времени на программирование? Выберите в "Мастере 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 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
以下はコードの一部です。trpar2=falseの とき、パラメータinput int grusdchf=100; input int grusdjpy=100; を最適化しないようにするにはどうしたらよいか。
//------------------------------------------------------------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;//
以下はコードの一部です。trpar2=falseの とき、パラメータinput int grusdchf=100; input int grusdjpy=100; を最適化しないようにするにはどうしたらよいか。
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ではそのような問題はありません。初回入金額からテストを始めるには?
ご指摘の状況を再現することはできません。
詳しくはこちら
ご指摘の状況を再現することはできません。
詳細を教えてください。
これはバグと思われます。
多通貨テストモードにおいて、2つの計器に新しいバーが 表示されるのを待つと、テスターが正しく動作しない。
少し説明します。isNewBar関数では、メインシンボルに新しいバーが現れたら、ループ内で他のシンボルに新しいバーが現れるのを待ちます。
コードを貼り付けています。
これはバグと思われます。
マルチカレンシーテストモードで、2つの計器に新しいバーが 表示されるのを待つと、テスターが正しく動作しない。
具体的にどのような点がバグだと思われますか、ご説明ください。テストの内容、得られた結果、期待される結果などの詳細が示されていませんね。
さらに、「MetaTrader 5におけるテストの基本」にもご注目ください。ダニの発生メカニズムや基本的な考え方を解説しています。
具体的にどのような点がバグだと思われますか、ご説明ください。テストの詳細や得られた結果が示されておらず、期待される結果がわからないのでは?
さらに、「MetaTrader 5におけるテストの基本」にもご注目ください。ダニの発生メカニズムや基本的な考え方を解説しています。
簡単なことです。
最適化のためにExpert Advisorを起動し、その結果を確認します。
例えば、4番目のパスを選択し、Expert Advisorを実行し、すべての取引でその正常な動作を取得します - ここにレポートがあります。
予感がします。多通貨最適化モードでは、オープンバーで取引が開始されていない場合、テスターはバーに取引をバインドすることができません。
isNewBar関数がループをコメントアウトし、他のシンボルでの新しいバーの出現を待たない場合、すべてが機能します。Terminal version 5 build 642.
そこから記事とコードを読ませていただきました。とはいえ、自分でもわかっているので、再読することもあるかもしれませんが。
ハッピーホリデー
ウィザードで、ストップがパラボリックの中型のEAを 生成しました。オープンプライスでテストを実行し、「キャンセル」をクリックする。2回目に実行したところ、上記のような状況になりました(残高と資本のチャートは再描画されず継続されます)。ウィザードにないExpert AdvisorはOKです。
を指定して、サービスデスク・アプリケーションを 作成します。
以下はコードの一部です。trpar2=falseの とき、パラメータ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; を最適化しないようにするにはどうしたらよいか。