mql4言語の特徴、微妙なニュアンスとテクニック

 
このトピックでは、mql4言語 での文書化されていない作業方法、特定の問題を解決する例について説明します。このブランチは、議論よりもFAQに近い内容であることが望ましいと思います。経験豊富なプログラマーの皆さんは、解決策やプログラミング技術、特にヘルプに記載されていない機能の網羅性を共有することをお勧めします。
 
では、まず私から。

注文を閉じるには、注文の種類と その種類に対応する価格を定義する必要は全くありません。OrderClosePrice()と書けば十分です。

/********************Script program start function********************/
void OnStart()
{
   int i, total = OrdersTotal()-1;
    for(i = total; i >= 0; i--)
     {
      if(OrderType() < OP_SELLSTOP)
       {
        if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100))
        printf("***********");
       }
     }
}/********************************************************************/
 

ヘルプには、他にも不正確な点がたくさんあります。例えば、SetIndexBuffer() を見てみましょう。ヘルプのどこが悪いのでしょうか?

「パラメータ

インデックス

[in]インジケーターバッファの 番号。ナンバリングは0から始まります。この数値は、#property indicator_buffersで宣言された値よりも小さくなければなりません。"(この記述は真実ではありません)

indicator_buffers プロパティは、表示するバッファの数を指定します。おそらく、このヘルプの意味は、確認していませんが、計算に使用するバッファは、SetIndexBuffer()で番号を与える必要はない、ということでしょう。しかし、私が確認したところ、計算に使用するバッファにSetIndexBuffer() で数値を与えると、iCustom()でその値を取得することができます。

 
理解できない。
 

開発者がこのスレッドを訪れているのだから--「機微とトリック」についての質問がある。

書式付き印刷の例:PrintFormat("Bid=%.5f", Bid)

質問:固定精度(ここでは5)の代わりに、精度が_Digitsに依存するようにフォーマット記述で条件を指定する方法はありますか?PrintFormat("Bid=%s",DoubleToString(Bid, _Digits)) のような「前処理」を行わずに行う場合。

 

MQL4では、#property strictの状態によって、同じコードでも異なる結果を得ることができます。そして、このときコンパイルが成功するのは、どちらも同じです。そのため、実行が「漫然」としていると、間違った場所(厳密には)で長い間原因を探すことになるのです。

 
Alexander Puzanov:

質問:固定精度(ここでは5)の代わりに 、_Digitsに依存するような条件をフォーマット記述で指定することは可能でしょうか?

いいえ、サンプルはhttps://www.mql5.com/ru/docs/common/printformat で ご覧になれます。
Документация по MQL5: Общие функции / PrintFormat
Документация по MQL5: Общие функции / PrintFormat
  • www.mql5.com
Общие функции / PrintFormat - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Описание проблемы

MQL4でインジケーターを書いています。DRAW_HISTOGRAM スタイルの文書化されていない機能に直面しました。

チャート上に値を表示するには、ヒストグラムの上側の値と下側の値の2つのバッファが必要です。インジケータ配列のバッファをマッピングする際、スタイル用のバッファが0と1、2と3、4と5などの値を持つ場合、すべてが正常に表示されます。ただし、スタイルバッファにOTHERから始まる値、つまり1と2、3と4、5と6を割り当てた場合、データウィンドウの値は正しく表示されますが、ヒストグラムの線はグラフに正しく表示されません。

DRAW_HISTOGRAMスタイルの記述が偶数バッファで始まるとは限らないので、この特殊性についての記述をドキュメントに追加するか、修正してください!

SDから。
 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

-アレックス-, 2017.02.07 18:21

MT4のExpert Advisorで、複数のグラフィックバッファを持つユーザーインジケータが一貫して呼び出される場合、再計算は呼び出しごとに行われるか、すべてのバッファは一度に計算され、あなたはコードで何度も指標を参照することができ、リソースの無駄があることを期待しないことができます私にアドバイスをお願いすることができます。また、コードが完了しない(1tickより長く実行される)にもかかわらず、インジケータの値が変化した場合、どうなるのかが知りたいです。


トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

バグ、バグ、質問

スラワ さん 2017.02.08 08:20

すべてのバッファを一度に計算します。静かにインジケーターの値を問い合わせる - 再計算はしない

MT4では、Expert Advisorから呼び出されたインジケータは、このEAのフローとその履歴データのコピーで動作します。Expert Advisor をループさせることができますが、同時に OnTick 呼び出し時に計算されたインジケーターデータを受け取ることができます。RefreshRatesを呼び出すまで。RefreshRatesはExpert Advisorの履歴データを更新し、その後、そのすべてのデータはインジケータの 最初の呼び出しで 再計算されます。

 
Alexey Viktorov:
注文を決済する場合、注文の種類と それに対応する価格を指定する必要はありません。価格OrderClosePrice()でクローズと書けばよいのです。

OrderClosePriceは、対応するOrderSelectの直後にのみ使用することができます。なぜなら、OrderSelectはOrder(const)関数のデータを一度コピーし、同じRefreshRatesでは更新ができないからです。

つまり、例えばOrderClosePriceがクローズできなかった場合、次の試行の前にOrderSelectを再度行う必要があります(RefreshRatesは必要ありません)。

ZS このスレッドは2005年の ものですここでは、開発者の詳細な主張を紹介します。

 
Rashid Umarov:
いいえhttps://www.mql5.com/ru/docs/common/printformat に例があります。

残念です...。

---

ポストが無駄にならないように。

StringGetCharacter("a", 0) の代わりに'a' とだけ書くことができます - StringSplit で文字列を分割する際によく必要となります。

理由: