[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 254

 
Desead:
皆さん、以前はエディターで予約語にカーソルを合わせてf1を押すと、下に機能の説明が書かれたウィンドウが開いていましたが、今はこれがないんです。何が問題なのでしょうか?
以前はCTRL+F1キーを押していました。
 
どうすれば常にポジティブな結果を得られるか、どなたか教えてください。(Buy lots - Sell lots)= -0.25 しかし、私はそれが常に正であることがしたいですか?
 
mikanit:
どうすれば常にポジティブな結果を得られるか、どなたか教えてください。(買いロット-売りロット)= -0.25 しかし、それは常に正の値でなければなりませんか?
MathAbs()
 

私はそうします: if (profitbuy+profitsell > SymbProf_magBUY_magSELL* MathAbs((OrdersTotalMagicBuyLots(MagicBuy)-OrdersTotalMagicSellLots(MagicSell))/Lots)())

かっこのなかはなに?

 

if (profitbuy+profitsell > SymbProf_magBUY_magSELL* MathAbs((OrdersTotalMagicBuyLots(MagicBuy)-OrdersTotalMagicSellLots(MagicSell))/Lots)(?????)

どこが、何?

 
ありがとうございます、解決しました。
 

出来高=0.05のポジションを建てる。コードが必要 - 損失が5桁の100ピップに達したときに0.01でポジション量を減らす方法?

ありがとうございます。

 

私が書いたEAは何本もありますが、いずれも保留注文で取引する際に相場状況(ストップレベリング、スプレッドなど)をチェックするものばかりです。グリッドの書き方を見ましたが、同じストップレベリングの値を確認してからオーダーを出すというのは見たことがありません。その理由は何でしょうか。

 
alsu:

テスターとその結果が実生活と異なる理由については、フォーラムにたくさんのメタラーがいます。記事欄をご覧ください。このトピックは何度も触れられています。

ありがとうございます。
 

代替品を発見

alsu:

つまり、DLLでは文字列はchar*として渡され、MqlStrとしては渡されないが、ex4プログラムではMqlStringとして格納 されないということである一般に、ex4からdllへのパラメータの転送は(開発者によれば)、あらゆる種類のチェックとパラメータの変換を伴う、かなり複雑なプロセスです。

ずん子

MQL4リファレンスは読まれましたか?MQL4-stringはc-stringにnull-terminatorをつけたものと同じです。

文字列の配列を並べるためだけの構造です。純粋に、文字列配列の作成を容易にするためのメタクオーツの発明です。

shlwapi.dllライブラリのStrStrA。テスト

#property indicator_chart_window
#import "stdlib.ex4"
string IntegerToHexString(int integer_number);//это для перевода десятичного формата в шестнадцатеричный, используем в print.
#import "StrAddress.dll"
int GetStrAddress(string szStr);//из самописной dll.
#import "shlwapi.dll"
int StrStrA(string pszFirst, string pszSrch);//из WinAPI.
#import

int addr1;//будет выходной переменной для функции из самописной dll.
int addr2;//то же самое для функции из WinAPI.

int init()
  {//тестовый прогон; в init(), это чтобы не повторялось
   string s; strAddress (s);
   s=""; strAddress (s);
   s=s+"something"; strAddress (s);
   s="MyStr"; strAddress (s);
   s="mystr"; strAddress (s);
   return(0);
  }

int start()
  {
   int    counted_bars=IndicatorCounted();//оставляем блок пустым
   
   return(0);
  }

void strAddress (string myStr)//тестовая функция
  {
   addr1=GetStrAddress(myStr);//эта из dll
   addr2=StrStrA(myStr,myStr);//эта из WinAPI
   Print(" строка ", CharToStr(34), myStr, CharToStr(34), " указатель 1: ", IntegerToHexString(addr1), ", указатель 2: ", IntegerToHexString(addr2));//в лог
  }

ログです。

строка "" указатель 1: 00000000, указатель 2: 00000000
строка "" указатель 1: 043 BE440, указатель 2: 00000000
строка "something" указатель 1: 043 C8970 указатель 2: 043 C8970
строка "MyStr" указатель 1: 043 BE450, указатель 2: 043 BE450
строка "mystr" указатель 1: 043 BE458, указатель 2: 043 BE458

строка "" указатель 1: 00000000, указатель 2: 00000000
строка "" указатель 1: 01 C980E0, указатель 2: 00000000
строка "something" указатель 1: 01 CDD050, указатель 2: 01 CDD050
строка "MyStr" указатель 1: 01 C980F0, указатель 2: 01 C980F0
строка "mystr" указатель 1: 01 C980F8, указатель 2: 01 C980F8

строка "" указатель 1: 00000000, указатель 2: 00000000
строка "" указатель 1: 01 CAFF20, указатель 2: 00000000
строка "something" указатель 1: 01 CA7100, указатель 2: 01 CA7100
строка "MyStr" указатель 1: 01 CAFF30, указатель 2: 01 CAFF30
строка "mystr" указатель 1: 01 CAFF38, указатель 2: 01 CAFF38

その仕組みは次の通りです。/system32にあるShlwapi.dll。StrStrA は、StringSubstr の WinAPI アナログです。MQL4は型なし言語なので、出力時に文字列ではなくintをセットすると、文字列ではなくポインタが取得されます。StrStrA は文字列の中で部分文字列が最初に出現する場所を探し(大文字と小文字を区別しますが、私たちの文字列は同じなので気にしません)、文字列が同じなので、その最初の文字へのポインタ、つまり文字列そのものを返します。

これからこのコードを使う人のために説明します。WinAPIには文字列のフォーマットがありません。その代わり、lpsz形式(0x00で終わる文字の配列の最初の要素へのポインタ、別名/0)しかありません。メモリアドレスへのポインタである。メモリセルは32ビット(つまり4バイト)であり、intも4バイトのサイズなので、すべてがそこにきちんと収まるのです。

結論:文字列をint型配列に簡単にパックすることができ、それによって構造体をエミュレートし(MQL4には構造体やクラスはありません)、構造体やクラスが必要な場合は、さらにそれをDLLに渡すことができるのです。データ型変換のための自作DLL(C++の "int(const char*)"(C型変換)等の構文)は、現在使用できません。