mql5言語の特徴、微妙なニュアンスとテクニック - ページ 62

 
ワシリー・プシュカリョフ
どのように見えるか、画像はありますか?OBJ_CHARTを まだ使っていないのでよく分からない

画像はありません。でも、手作業で作ることができるんです。挿入→オブジェクト→グラフィックオブジェクト→チャートを 選択し、このようにOBJ_CHARTを挿入した後、オブジェクトのプロパティで「オブジェクトを背景として描画」を選択し、スケールを無効にします。

 
fxsaber

画像はありません。でも、手作業で作ることができるんです。挿入→オブジェクト→グラフィックオブジェクト→グラフィックを 選択し、このようにOBJ_CHARTを挿入した後、オブジェクトのプロパティで「オブジェクトを背景として描画」を選択し、スケールを無効にします。


ありがとうございます。

 

デバッグモードでは、関数や式が返す値を知ることはできません。

例えば

void OnStart()
{
  double Angle = 1;
  double d = MathSin(Angle / 2) * MathSin(Angle * 2);
}

例えば、割り当てられた関数が何を返したか、などです。


私は(デバッグモードに限らず)この方法で使っています。

template <typename T>
T MyPrint( const T Value, const string Str )
{
  static const bool IsDebug = MQLInfoInteger(MQL_DEBUG);

//  if (IsDebug)
  {
//    DebugBreak(); // если хочется посмотреть средствами дебага

    Print(Str + " = " + (string)Value);
  }
  
  return(Value);
}

#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + (string)__LINE__ + ": " + #A)

void OnStart()
{
  double Angle = 1;
  double d = _P(MathSin(Angle / 2)) * _P(MathSin(Angle * 2));
}


結果

void OnStart(), Line = 21: MathSin(Angle/2) = 0.479425538604203
void OnStart(), Line = 21: MathSin(Angle*2) = 0.9092974268256817
 

取引要求確認結果(MqlTradeCheckResult)構造体

フィールドの説明

フィールド

商品説明

バランス

取引操作の実行後になる残高値

エクイティ

取引成立後の持分価値

マージン

必要な取引操作に必要な証拠金

マージンフリー

必要な取引を実行した後に残る資本の額

マージンレベル

必要な取引操作の実行後に設定される証拠金レベル

これらのフィールドは、「取引」タブの行に対応しています。


Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата проверки торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата проверки торгового запроса
  • www.mql5.com
Прежде чем отправить торговому серверу запрос на торговую операцию, рекомендуется провести его проверку. Проверка осуществляется функцией OrderCheck(), которой передается сам проверяемый запрос и переменная типа структуры MqlTradeCheckResult. В эту переменную и будет записан результат проверки.
 
fxsaber

これらのフィールドは、「取引」タブの行に対応しています。


同じ値で現在の状態を 示していますが、取引 実行後の 計算 値を返す構造になっているのでは?

 
アルチョム・トリシキン

同じ値で現在の状態を 示していますが、取引 実行後の 計算 値を返す構造になっているのではないでしょうか?

取引注文が実行された場合に、この行に入るであろう計算値を表示します。

 

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

汎用クラスライブラリ - バグ、説明、質問、使用上の特殊性、提案

レナート・ファットフーリン さん 2017.12.08 23:34

取引記録形式は流動的で定期的に拡大するため、MqlDealの構造は持っていません。これなくして、プラットフォームの機能を拡張することは不可能です。

そのため、Get機能でアクセスするしかありません。また、以前に影響を受けたレコードの他のフィールドへのアクセスは、そのレコードがキャッシュされているため、最初のアクセスよりも何倍も速く なります。

上記のテストでは、取引番号が毎回新しくなるため、以前に選択した 取引のキャッシュが継続的に破棄されます。

 

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

MT5とMT4の比較。アレイを埋める速度。

レナート・ファットフーリン さん 2017.12.12 12:19

1) 考え方が間違っている、ローカルアレイは速く埋まらない(マイクロレベルまで落とさずに大雑把に言うと)

2) 配列は通常の初期化関数で素早く埋める必要がある.

3) 速度を最大化するためには、配列をベクトル(1次元)のままにしておく方が、アクセスを最適化する機会が多くなります。なぜなら、多次元化は必須フレームを厳しく制限し、コンパイラに多次元インデックスの余分な定数計算を強いるからです。

4) クイックアクセス用の配列は静的にしておくことで、異常値チェックの回数を激減できる

 

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

mql5 の売りポジションを開始

fxsaber さん 2017.12.12 21:56

// true - not for trade by market-orders
bool IsBadFilling( const string Symb )
{
  return(!(SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE) & (SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK)));
}

void OnTick()
{
  if (IsBadFilling(_Symbol))
  {
    Print("Change symbol " + _Symbol + " or server " + AccountInfoString(ACCOUNT_SERVER) + " for trade by market!");
    
    ExpertRemove();    
  }
}


結果

2017.12.05 00:00:00   Change symbol EURUSD or server AMPGlobalClearing-Demo-CQG for trade by market!

テスターでマーケットが開かない原因を迅速に把握することができます。このように成行注文が禁止され、保留注文が禁止されないのは、テスターの不始末なのかもしれませんね。


SYMBOL_FILLING_MODEがゼロのとき、テスターはこの値を(SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK)に置き換えることを提案します。つまり、ブローカーが適切なシンボルフィールドを指定できなかった場合に、完全な取引を許可したのです。

 
// Опознает кривые COPY_TICKS_INFO-тики
// Отсутствие цены (высохшая сторона стакана - нулевая цена) не признается валидной ситуацией
bool IsTickInfoBad( const MqlTick &Tick )
{
  return(!Tick.ask || !Tick.bid || Tick.last || Tick.volume || ((Tick.flags & (0x7F ^ (TICK_FLAG_ASK | TICK_FLAG_BID))) != 0));
}

#define  DEFINE_FIELD(A)             \
  if (!Ticks[i].##A)                \
    Ticks[i].##A = Ticks[i - 1].##A

// Корректирует ошибочные COPY_TICKS_INFO-тики
void CorrectTicksInfo( MqlTick &Ticks[] )
{
  const int Size = ArraySize(Ticks);
  
  for (int i = 1; i < Size; i++)
    if (IsTickInfoBad(Ticks[i]))
    {
      DEFINE_FIELD(bid);
      DEFINE_FIELD(ask);      
      
      Ticks[i].last = 0;
      Ticks[i].volume = 0;
      Ticks[i].flags = TICK_FLAG_ASK | TICK_FLAG_BID;
    }
}
TSが誤ってアカウントを消耗しない ように、CopyTicks(COPY_TICKS_INFO)の後に毎回このようなことをすることをお勧めします。
理由: