MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 176

 
mila.com:

読むが、ループの前にファイルを 開くとは思いもよらなかった )

よく読んでないかもしれませんが )
ファイルを一行ずつ最初から最後まで読む例も...。
 

Expert Advisorがあり、取引時にピンバーでガイドされる。このロボットは通貨では正しく機能しますが、CFDでは全く予想がつきません。

どうすればこのようなことが起こるのか、教えてください。

 
RichLux:

私は、取引時にPinbarをベースにしたロボットを書きました。このロボットは通貨では正しく機能しますが、CFDでは全く予測不可能です。

どうすればこのようなことが起こるのか、教えてください。

ここに、 あなたのケースのすべてがあります。
 

以下は、Pinbar定義関数です。

int Pin() { 
  double Close1 = iClose (_Symbol,_Period,1); 
  double Open1 = iOpen (_Symbol,_Period,1); 
  double Low1 = iLow(_Symbol,_Period,1); 
  double High1 = iHigh (_Symbol,_Period,1); 
  double Close2 = iClose (_Symbol,_Period,2); 
  double Open2 = iOpen (_Symbol,_Period,2); 
  double Low2 = iLow(_Symbol,_Period,2); 
  double High2 = iHigh (_Symbol,_Period,2); 
  if (MathAbs(Close1-Open1)/(High1-Low1)<= BodyPercent) 
    { 
       if(Close1>High1 - BodyLocaut*(High1-Low1)&&Open1>High1-BodyLocaut*(High1-Low1)&&Low1<Low2-nose*_Point && High2>High1) 
          return (1); 
       if(Close1<Low1 + BodyLocaut*(High1-Low1)&&Open1<Low1+BodyLocaut*(High1-Low1)&&High1>High2+nose*_Point && Low2<Low1) 
          return (-1); 
    } 
  return(0); 
}

Expert Advisor に挿入すると、通貨ペアで正常に機能する(Expert Advisor が関数の条件に対応するバーの次のバーでディールを設定する)。しかし、CFDの取引はどこでも開かれています。

この機能の場合、CFDと通貨ペアはどう違うのですか?

 
RichLux:

以下は、Pinbar定義関数です。

Expert Advisor に挿入すると、通貨ペアで正常に機能する(Expert Advisor が関数の条件に対応するバーの次のバーでディールを設定する)。しかし、CFDの取引はどこでも開かれています。

この機能の場合、CFDと通貨ペアはどう違うのですか?

まず、すべての&&を{}に置き換えて、各条件がそれぞれのブロックに入るようにします。そして、それぞれのブロックのテスト結果をアンプリントして、ログにどんな値が出るか見てみましょう。
 
Artyom Trishkin:
まず、すべての&&を{}に置き換えて、各条件がそれぞれ独立したブロックになるようにし、各ブロックでテスト結果を巻き戻して、どんな値が得られるかをログで確認します。

ありがとうございます。アドバイスに従って、自分がどこを間違えていたのか理解できました。というのも、私のEAは5桁で動いていて、CFDは2桁しかなく、最低50pipsのEAに反応すると思っていたら、5pipsから反応があったのです。失敗しちゃった。

この点、よろしくお願いします。

コードの中にそのような部分があります。

MathAbs(Close1-Open1)/(High1-Low1)

High1=Low1となることもあります。すると、テスターは「ゼロで割り切れない」というクリティカルエラーを 発生させる。

どのように回避するのか?

 
RichLux:

ありがとうございます。アドバイスに従って、自分がどこを間違えていたのか理解できました。というのも、私のEAは5桁で動いていて、CFDは2桁しかなく、最低50pipsのEAに反応すると思っていたら、5pipsから反応があったのです。失敗しちゃった。

この点、よろしくお願いします。

コードの中にそのような部分があります。

High1=Low1となることもあります。すると、テスターは「ゼロで割り切れない」というクリティカルエラーを 発生させる。

どのように回避するのか?

何も考えずにできる。

MathAbs((Close1-Open1)/(High1-Low1>0?High1-Low1:0.00001))
削除済み  

こんにちは、コンパイル中に問題が発生しました。


void OnTick()

{

double minprice=-999999、mp、maxprice=-999999。

for(int i=0; i<10; i++)

{

mp = iLow(Simbol(), PERIOD_CURRENT, i);

if (mp < minprice)

minprice = mp;

}


for(int i=0; i<10; i++)

{

mp = iHigh(Simbol(), PERIOD_CURRENT, i);

if (mp > maxprice)

maxprice = mp;

}

Comment("最低価格: " + DoubleToString(minprice, 5) + "\n" + "最低価格")

"最大価格: " + DoubleToString(maxprice, 5))

}


ソースコードは、コンパイラがiLowとiHighと変数Simbol()でそこに文字列モードで誓う関数が含まれていますが、それは例で別の問題を解決します。上のコードのどこを直せばいいのでしょうか。ル ープを確認するためのコンパイルができず、行き詰っています。

教科書より

現在の不完全なバーに対応する値を取得したい場合、次のようになります。

の場合、start_pos=0、count=1を指定して、最初の呼び出し形式を使用することができます。

#property copyright "2009, MetaQuotes Software Corp."

#プロパティリンク "https://www.mql5.com"

#property version "1.00"

#property description "High[i]とLow[i]の値の出力例"

#property description "ランダムに選ばれたバー用"

double High[],Low[];

//+------------------------------------------------------------------+

//| 指定されたバー番号の安値を取得します。

//+------------------------------------------------------------------+

double iLow(文字列シンボル,ENUM_TIMEFRAMESタイムフレーム,intインデックス)

{

double low=0;

ArraySetAsSeries(low,true)です。

int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);

if(copied>0 && index<copied) low=Low[index];

return(low)です。

}

//+------------------------------------------------------------------+

//| 与えられたバー番号の高値を取得します。

//+------------------------------------------------------------------+

double iHigh(文字列シンボル,ENUM_TIMEFRAMESタイムフレーム,intインデックス)

{

double high=0;

ArraySetAsSeries(high,true)です。

int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);

if(copied>0 && index<copied) high=High[index];

return(high)です。

}

//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
geratdc:

こんにちは、コンパイル中に問題が発生しました。


void OnTick()

{

double minprice=-999999、mp、maxprice=-999999。

for(int i=0; i<10; i++)

{

mp = iLow(Simbol(), PERIOD_CURRENT, i);

if (mp < minprice)

minprice = mp;

}


for(int i=0; i<10; i++)

{

mp = iHigh(Simbol(), PERIOD_CURRENT, i);

if (mp > maxprice)

maxprice = mp;

}

Comment("最低価格: " + DoubleToString(minprice, 5) + "\n" + "最低価格")

"Maxprice: " + DoubleToString(maxprice, 5));

}


ソースコードは、コンパイラがiLowとiHigh b変数Simbol()がそこに文字列モードであることを誓う関数が含まれていますが、それは例の中で別の問題を解決しています。上のコードのどこを直せばいいのでしょうか。ル ープを確認するためのコンパイルができず、行き詰っています。

教科書より

現在の不完全なバーに対応する値を取得したい場合、次のようになります。

の場合、start_pos=0、count=1を指定して、最初の呼び出し形式を使用することができます。

#property copyright "2009, MetaQuotes Software Corp."

#プロパティリンク "https://www.mql5.com"

#property version "1.00"

#property description "High[i]とLow[i]の値の出力例"

#property description "ランダムに選ばれたバー用"

double High[],Low[];

//+------------------------------------------------------------------+

//| 指定されたバー番号の安値を取得します。

//+------------------------------------------------------------------+

double iLow(文字列シンボル,ENUM_TIMEFRAMESタイムフレーム,intインデックス)

{

double low=0;

ArraySetAsSeries(low,true)です。

int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);

if(copied>0 && index<copied) low=Low[index];

return(low)です。

}

//+------------------------------------------------------------------+

//| 与えられたバー番号の高値を取得します。

//+------------------------------------------------------------------+

double iHigh(文字列シンボル,ENUM_TIMEFRAMESタイムフレーム,intインデックス)

{

double high=0;

ArraySetAsSeries(high,true)です。

int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);

if(copied>0 && index<copied) high=High[index];

return(high)です。

}

//+------------------------------------------------------------------+


Simbol() Symbol() または_Symbolと書くべきところ、間違っています。
削除済み  
Sergey Gritsay:

Simbol() - Symbol() または _Symbol と記述する必要があります。

ありがとうございます。シンボルのスペルを正しく表記することで、シンボルの誤りを修正しました。iLowと iHighの関数が おかしいのですが。

MQL4とMQL5の類似度(%)は?

ファイル:
1.png  64 kb