MQL4と旧コードのアップデート(問題解決体験の共有化)

 

このトピックは、アップデートを踏まえても参考になるかと思います。

先日、愚かにもターミナルを更新することにして、その上でExpert Advisorをテストしましたが、リアル口座では更新していませんでした。

エラーが出た。開発者が悪いとは言いたくない、私にも責任がある。しかし、いくつかの問題が発生したため、詳細を明記したいと思います。

1.変数名の不正確な文字:コンパイラが$記号を不正確と表示したため、単純なものです。素早く簡単に修正した。コンパイル段階でのエラーはもうない。

その後、コンパイラが文句を言わないExpert Advisorの不具合を見つける必要がありました。

2.テストを起動すると、stdlib.ex4というライブラリが見つからないという汚い言葉が表示されました。解決策は、指定されたフォルダにstdlibのソースコードを見つけ、再コンパイルすることでした。

3.そして、私が理解したNULLと0(ゼロ)が別物であることに関連するバグを排除しました。iOpen(NULL,PERIOD_W1,1) のような以前の関数は iOpen(0,PERIOD_W1,1) として、つまり 0 と NULL の両方を指定することができ、正しく機能しました。今は動作しませんが、コンパイラが悪さをするわけでもなく、Expert Advisorの動作中にエラーが出るだけです。

4.NormalizeDouble(pr1,Digits)を使って、建値、ストップレベル、利益を設定していたのですが、USDJPYを小数点以下3桁でテストすると、この関数は常に小数点以下4桁の値を返すので、注文を開くときにエラーが発生することに気がつきました。DigitsをDigits()に置き換えたところ、すべてうまくいくようになりました。

現在、私のEAに他の問題がないかをチェックしているところです。

ちなみに、古いコードを再コンパイルしない場合、ex4はエラーなく動作します。

私のビルドは現在579で、リアルではまだ509が動いていて、フライトは大丈夫なのですが、アップグレードが怖いのです。

もし、移行に際して問題が発生した方がいらっしゃいましたら、ここに投稿していただければ、他の方のお役に立つと思います。

 
583のチェックをお願いします。
 

Point変数 についても同様の問題があります。Point()への変更

583の組み立てはまだしていません。そして、私のブローカーはまだ持っていないのです。

 

もう一度、ディジットと ポイントについて。

この問題は、同じExpert Advisorを異なる桁数のシンボルでテストしたときに発生することがわかりました。テスターでは、これらの変数を変更することはできないようです。例えば、最初にイエロブドルでテストして、テスターでドルのシンボルを変更すると問題が発生します。あるいはその逆もしかり。

ですから、もしかしたらこれはテスターの問題で、実生活では起こらないかもしれません。しかし、私は念のため、常にDigits on Digits () とPoint on Point () を変更しています。

UPDATEを変更しても効果がない。端末を再起動するのみで、解決します。

 
ありがとうございます。月曜日に確認し、修正する予定です。
 

ああ、私のコードはめちゃくちゃだと思ったのに......。

また、テスターでは、最初のテストが4桁の場合、円ペアがテストされなくなり、ポジションが開かれ なくなり、EAが動作しません。その上でテストを行うには、ターミナルを再起動するか、EAを再コンパイルする必要があります。

584を構築。

いや、私のコードが完璧だとは言いませんが、ビルド509の同じコードがテスターでテストされたシンボルの変更中にターミナルを再起動することなく、再コンパイルすることなく動作しました。


追伸:今までは型構成体を呼び出すことで問題を解決してきました。

   digits = MarketInfo( Symbol(), MODE_DIGITS);
   point = MarketInfo( Symbol(), MODE_POINT);

というのは、これらの変数に単に値を代入するのではなく、同じことを意味するように思われるからです。

digits = Digits;
point = Point;
 

グラフのCommentを文字列に変換する際、Digits(4が出る)を5で置き換えています。デバッグをオンにして、何かを編集し、一時停止すると、チャートが消え、デバッグが完了すると、Expert Advisorが付いた新しいチャートが表示されますが、インジケータはありません。このままなのか、それとも一時的なものなのか。

Demoの方だけ更新されたのは良かった。Realのほうはまだ更新されていません。どうしよう、小さなマイナスにポジションが空いてる!?

 

緑色の矢印は、スタート地点の1行目を指しています。

intdigits= MarketInfo( Symbol(), MODE_DIGITS); そして、一番下にあるのは: MQL4Experts "EA name" start and line number No errors, but does not compile what does it mean?何も起こらないよ!」と言われました。説明していただけますか!?

 

wininet.dllのInternetOpenUrlA()が動作しなくなった。

インターネットページテキストの代わりに0(ゼロ)を出力します。

以下は、そのコードの全容です。

#import "wininet.dll"

int InternetOpenA( string sAgent, int lAccessType, string sProxyName, string sProxyBypass, int lFlags );

int InternetOpenUrlA( int hInternetSession, string sUrl, string sHeaders, int lHeadersLength, int lFlags, int lContext );

int InternetReadFile( int hFile, int& lpvBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[] );

int InternetCloseHandle( int hInet );

int InternetQueryDataAvailable( int hFile, int& lpdwNumberOfBytesAvailable[], int dwFlags, int dwContext );

int HttpQueryInfoA(int hRequest, int dwInfoLevel, int& lpvBuffer[], int& lpdwBufferLength[], int& lpdwReserved[] );

#import


#define INTERNET_OPEN_TYPE_PRECONFIG 0x00000000 // use registry configuration

#define INTERNET_FLAG_RELOAD 0x80000000

#define INTERNET_FLAG_NO_CACHE_WRITE 0x04000000

#define INTERNET_FLAG_PRAGMA_NOCACHE 0x00000100



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

//| script program start function |

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

int start()

{

if(!IsDllsAllowed())

{

Alert("Необходимо в настройках разрешить использование DLL");

return(0);

}

int hInternetSession = InternetOpenA("Microsoft Internet Explorer",

0, "", "", 0);

if(hInternetSession <= 0)

{

Alert("Ошибка при вызове InternetOpenA()");

return(0);

}

int hURL = InternetOpenUrlA(hInternetSession,"https://www.mql4.com", "", 0, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0);

if(hURL <= 0)

{

Alert("Ошибка при вызове InternetOpenUrlA()");

InternetCloseHandle(hInternetSession);

return(0);

}

int cBuffer[256];

int dwBytesRead[1];

string TXT = "";

while(!IsStopped())

{

bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead);

if(dwBytesRead[0] == 0)

break;

string text = "";

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

{

text = text + CharToStr(cBuffer[i] & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 8 & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 16 & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 24 & 0x000000FF);

}

TXT = TXT + text;

Sleep(1);

}

if(TXT != "")

{

int h = FileOpen("SavedFromInternet.htm", FILE_CSV|FILE_WRITE);

if(h > 0)

{

FileWrite(h,TXT);

FileClose(h);

Alert("Готово! См. файл .../experts/files/SavedFromInternet.htm");

}

else

{

Alert("Ошибка при вызове FileOpen()");

}

}

else

{

Alert("Нет считанных данных");

}

InternetCloseHandle(hInternetSession);

return(0);

}

 
文字列を統一するため、InternetOpenUrlWを使用する必要があります。
 
Renat:
文字列を単一化したため、InternetOpenUrlWを使用する必要があります。

確かに効きましたね。ありがとうございました。
理由: