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

 
Vladimir Pastushak:

手動で作成したグラフィックオブジェクトとインジケーターや EAで作成した オブジェクトを区別することは可能ですか?

機能では

OBJPROP_HIDDEN

ターミナルメニュー「チャート」-「オブジェクト」-「オブジェクトのリスト」からグラフィカルオブジェクトの名前をバーリングします。値trueは、リストから不要なオブジェクトを非表示にすることができる。デフォルトでは、カレンダーイベント、取引履歴を表示するオブジェクト、およびMQL5プログラムから作成されたオブジェクトに trueが設定されています。このようなグラフィカルなオブジェクトを 表示し、そのプロパティにアクセスするには、「オブジェクトのリスト」ウィンドウで「すべて」をクリックします。

ブール

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов...
 
おそらく既知のことだと思いますが、私自身はこのニュアンスに気づきませんでした。

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

ライブラリ: エキスパート

fxsaber, 2020.10.09 04:55

bool ReloadChart( const long Chart )
{
  return (ChartSaveTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") &&
          ChartApplyTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") && // Поставили задание в очередь чарта.
          ChartGetInteger(Chart, CHART_WINDOW_HANDLE));                 // Заставляем двигаться очередь.
}

コードの重要な場所にハイライトを入れました。これがないと、スクリプトの最後までパターンの適用がない。

 
EventChartCustomの第1入力パラメータについて

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

MT5とスピードの関係

アントン 2020.10.08 11:00

意味も違えば、実行の仕組みも違う。0 - "自分の "チャートの待ち行列にあるイベント。-1 - イベントを自分自身のキューに入れる。

 
Vladimir Pastushak:

一週間の終わりには、もう頭がおかしくなっている。

mt5でヘッジのオープンポジションのチケットがある 例:123456

ポジションをクローズ した後に利益計算をしたいのですが、できません。

そうなんですが、コミッションしかもらえないんです...。

チケットで決済したポジションの利益を得るにはどうしたらいいですか?

HistorySelectByPosition()を使って、より良いトレードを選択するようにしてください。

Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть  в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
 

あるmqhの中で、以前別のmqhから呼び出されたことがあるかどうかを調べる必要があったのです。mqhは互いの存在を意識しない。どちらかが入っていて、どちらかが入っていないかもしれない。

全体として、この問題は(私にとっては)異常です。割とカクカクした感じで解決。

void f1()
{
  SetUserError(0);
}

void f2()
{
  if (_LastError == ERR_USER_ERROR_FIRST)
    Print("f1() была вызвана.");
  else
    Print("f1() не была вызвана");
}

void OnStart()
{
  f1();
  f2();
}

非常に悪い習慣だと思いますが、うまくいっています。

 
アラートウィンドウを 閉じる必要がある人がいる場合。
// Закрытие Alert-окна
bool CloseAlert()
{  
  const long Chart = ChartOpen(_Symbol, _Period);  
  const bool Res = Chart && !ChartSaveTemplate(Chart, NULL);
                            
  if (Chart)
    ChartClose(Chart);
    
  return(Res);  
}
 
fxsaber:

あるmqhの中で、以前別のmqhから呼び出されたことがあるかどうかを調べる必要があったのです。mqhは互いの存在を意識しない。どちらかが入っていて、どちらかが入っていないかもしれない。

全体として、この問題は(私にとっては)異常です。割とカクカクした感じで解決。

非常に悪い習慣だと思いますが、うまくいっています。

LastErrorを使用すると、サードパーティライブラリを接続する際に、ユーザーエラーコードが衝突する確率が0ではない、という解決できない問題があります。独自のlastErrorを維持するための代替案として。すべてのmqhでincludeguardに包まれたグローバル変数、または単一の変数のどちらかです。
 

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

MT5とスピードの関係

fxsaber さん 2020.10.20 12:28

高速アンロード機の中間まとめ。

バーやインジケータを使ってトレードしている人にとって、価格データの関連性は非常に曖昧なものです。

ダニやタンブラーはリアルタイムになりにくい。

 
MT5では、Sleep(0) == Sleep(1)です。このため、MT4のようにSleep(0)を使用してもCPUに大きな負荷がかかることはありません。

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

mql5の特性、ヒントとコツ

スラバ さん 2018.09.20 15:40

PS.MQL5のSleep()関数は、win api関数 ::Sleep() へのリダイレクトではありません。より正確には、値が100未満の場合はリダイレクトとなります。しかし、100以上はループでその中にwin api slipが入っているので、IsStoppedで割り込むことができる。

もうひとつ、微妙な点があります。ミリ秒<0の場合、1を頭に付ける。つまり、::Sleep(0)を呼ぶことはない。

もう忘れ去られています。MT5のみ該当。MT4では、Sleep(0)で端末をサスペンドすることができます。

 
私は、Virtualをポインタに変更することで、呼び出しのたびに追加の条件をチェックする必要がないようにするアイデアを思いつきました。
  static double VirtualSymbolInfoDouble( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )
  {
    return(VIRTUAL::SelectOrders ? VIRTUAL::SelectOrders.SymbolInfoDouble(Symb, Property) : ::SymbolInfoDouble(Symb, Property));
  }


しかし、まずは簡単な例で性能を比較してみることにしました。

// Сравнение производительности функции с доп. условием и указателя на функцию.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

typedef double (*TFunc)( const int ); // Определяем нужный тип указателя на функцию.

double Prices[];

double GetPrices2( const int Pos )
{
  return(Prices[Pos]);
}

double GetPrices( const int Pos )
{
  return(Pos >= 0 ? GetPrices2(Pos) : 0); // Специально введено доп. условие, чтобы уменьшить производительность.
}

void OnStart()
{
  const int Size = ArrayResize(Prices, 1 e7);
  
  double Sum1 = 0;
  double Sum2 = 0;

  TFunc Func = GetPrices2;
    
  // Замер производительности через указатель функции.
  _BV(
  for (int i = 0; i < Size; i++)
    Sum2 += Func(i);
      , 1)


  // Замер производительности через функцию с доп. условием.
  _BV(
  for (int i = 0; i < Size; i++)
    Sum1 += GetPrices(i);
      , 1)  

  Print(Sum1);
  Print(Sum2);
}


その結果

2020.10.21 01:07:00.745 Test9 (AUDCAD,H1)       Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 29 in OnStart: for(inti=0;i<Size;i++)Sum2+=Func(i);] = 33906 mcs.
2020.10.21 01:07:00.756 Test9 (AUDCAD,H1)       Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 36 in OnStart: for(inti=0;i<Size;i++)Sum1+=GetPrices(i);] = 10923 mcs.


typedefのバリエーションは3分の1の差で負けている。肝心なところではお断りしました。例えば、TCの場合、同じOrdersTotalがオプティマイザーのパスの目盛りごとに少なくとも一度は呼び出されます。


デバッグモードでは、状況は逆になります。ですから、MT4でtypedefを使用して高速化することは理にかなっています。

理由: