MQL5言語をゼロから独学で学ぶ - ページ 58

 
MrBrooklin:

標準的なテンプレートを作成しました。そこでコードを書き始めたのですが、ここではすでに書き終えた断片を掲載するようにしました。自作関数でアルゴリズムの枠組みを考えたことはありませんでした、ヒントありがとうございますまた、ネッティングアカウントの情報もありがとうございました


識字プログラミングからそのようなテクニックがあります。とても速く、わかりやすく書くことができるようになるのです。

一般に文語体で、何をするのかコメントに書く(主な直列だけでいい)

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

基本的にすべて。さらに、各コメントの後に、3〜5行(一般的には少し)のコードを書きます。最初から最後まで、機能全体がご覧の画面に収まること。それ以上になると、フラグメントを別の関数/メソッドに分離する必要があることを意味する。

そんな初歩的なことがテスターで動き出すと、一般化したり、実生活の条件を加えたり、例えば段差や周波数を変えたり、市場の状況を 考慮したり、完成度は限りなく高くなる...。

 
Maxim Kuznetsov:

抽象的な表現ですが、非常に速く、はっきりとした文章を書くことができる識字プログラミングの技術があります。

一般に文語体で、何をするのかをコメントに書く(主な直列のみ)

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

基本的にすべて。さらに、各コメントの後に、3〜5行(一般的には少し)のコードを書きます。最初から最後まで、機能全体がご覧の画面に収まること。それ以上になると、フラグメントを別の関数/メソッドに分離する必要があることを意味する。

そんな初歩的なことがテスターで動き出すと、一般化したり、実生活の条件を加えたり、例えば段差や周波数を加えたり、市場の状況を 考慮したりと、完成度は限りなく高くなる......というわけです。

マキシムさん、こんにちは!チップの件、大変助かりました。標準的なEAテンプレートにどのように記入するか悩んでいるところです。

ウラジミールさん、ありがとうございます。

 
MrBrooklin:

プログラミングの専門家の皆様へ

2つの質問についてご説明ください。

  1. マジックナンバーについて最初の質問ですが、入力パラメータで作成されるのは、保留中の注文と オープンポジションだけですか(またはオープンポジションだけですか)、それともEA自体にも作成できますか?この質問に対して、私は本当に混乱してしまい、良い答えを持っていないのです。
  2. マジックナンバーに関する2つ目の質問ですが、もし現在のチャートに複数のオープンポジションがある場合、それぞれのポジションを決定するためにこのような入力パラメータを適用することは可能です。

プログラミングにおけるMagic Numberの応用について、私は全く誤解しているのかもしれません。

敬具 ウラジミール

注文が実行のために受け入れられるとき、そのすべての特性(シンボル、時間、注文タイプ、チケット)は、ユーザーによってではなく、端末によって割り当てられます(ユーザーによって要求され、端末によって割り当てられる)。そして、そのマジックナンバーがユーザー識別子です。引用元

つまり、注文やポジションと特定の保留中の要求を一意に識別し、関連付ける必要があるのです。

NAMIは意味が抜けている。そして、アルテムはオーダーの分類をマジックの数字に落とし込んでいく。最初の2桁は注文の種類など何かを示し、次の4桁は注文の日付を示します。

何かのアルゴリズムについて。最初に初期条件を定義する。私たちのシンボルにはオーダーがあり、それを考慮しないか、考慮する。アルゴリズムを作成する際に初期条件の手直しがなく、さらにコードが永遠に続く可能性がある)

 
Maxim Kuznetsov:

抽象的な表現ですが、非常に速く、はっきりとした文章を書くことができる識字プログラミングの技術があります。

一般に、リテラシー・プログラミングのスタイルで、何をするのか(主な直列だけ)をコメントに書く・・・。

...基本的にすべて。次に、各コメントの後に、3~5行(一般的にはあまり多くない)のコードを書きます。最初から最後まで、機能全体がご覧の画面に収まるようにします。それ以上になると、フラグメントを別の機能/メソッドに分離する必要があるということです。

Maxim、あなたのヒントが正しいかどうか、あるいは他に何か追加すべきことがあるかどうか、確認してください。テストの部分というのは、まだコードを書いていないからです。

ウラジミールさん、ありがとうございます。

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
// установим входные параметры: "Уровень перестановки Stop Loss в безубыток" и "Шаг трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---

// 1. берём позицию Buy
// 2. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 4. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 
MrBrooklin:

マキシム、あなたのヒントが正しいかどうか、あるいは他に何か付け加えるべきことがあるかどうか、見てください。コードとは別のテスト部分ということです。

敬具 ウラジミール

初期条件私たちのシンボルにポジションがあることを計算し、それをチャートで見るのです。

ポジションを持つ場合は、買いか売りか、どちらか1つだけです。そこで、まずはシンボル上のポジションを検索します。特性を要求/取得する。ポジションの種類(買いか売りか)の決定。といった具合に、文章を通して

 
Valeriy Yastremskiy:

注文が実行のために受け入れられるとき、そのすべての特性(シンボル、発行時刻、注文タイプ、チケット)は、ユーザーによってではなく、端末によって割り当てられます(ユーザーによって要求され、端末によって割り当てられます)。ポジションと同様に、ポジションはその注文に関する情報を保存しますが、その数は多くてもかまいません。そして、そのマジックナンバーがユーザー識別子です。引用元

つまり、注文やポジションと特定の保留中の要求を一意に識別し、関連付ける必要があるのです。

NAMIは意味が抜けている。そして、アルテムはオーダーの分類をマジックの数字に落とし込んでいく。最初の2桁は注文の種類など何かを示し、次の4桁は注文の日付を示します。

何かのアルゴリズムについて。最初に初期条件を定義する。私たちのシンボルにはオーダーがあり、それを考慮しないか、考慮する。アルゴリズムを作るときに初期条件の手直しがないと、さらにコードが永遠にかかることもある)

Valeriyさん、詳しいご回答ありがとうございました。いろいろなことがクリアになりました。アルゴリズムについては私も同じように感じていますが、このEAにマジックナンバーが必要ない理由は、すでにVassilyが説明しています。

ウラジミール

 
MrBrooklin:

Valeryさん、詳しいご回答ありがとうございました。かなりスッキリしました。アルゴリズムについては私も同じ意見ですが、このEAにマジックナンバーが必要ない理由はVasiliyが既に説明しています。

敬具 ウラジミール

チャートを開き、チャートシンボルにポジションがあるのですが、それが何かわからず、ブレイクイーブンでオープンし、価格が反転した場合に損失を減らすためにSLをトラリピしたいのですが、どうしたらよいでしょうか。

 

Valery氏による修正で、コメント付きのEAテンプレートは新しい姿になりました。

ウラジミールさん、ありがとうございます。

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
// установим входные параметры для "Уровня перестановки Stop Loss в безубыток" и "Шага трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---
// 1. ищем все позиции на текущем символе:
//    - отправляем запрос на сервер и получаем характеристики открытых позиций
//    - определяем тип открытой позиции - Buy или Sell 
// 2. берём позицию Buy
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 4. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 5. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 

ウラジミール、長い間、それを利用する必要はないんだ。さあ、アクションに入ろう。希望するトレーリングのテンプレートを書いておきました。

//+------------------------------------------------------------------+
//|                                                  TestingTral.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MrBrooklin"
#property link      "http://www.mql5.com"
#property version   "1.00"
input double BreakevenValue = 100.0; // Величина безубытка, в пунктах инструмента
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //-- Выбираем позиции по текущему символу. Если позиции нет выбирать нечего - выходим
   if(!PositionSelect(Symbol()))
      return;
   //-- Стоп-лосс длинной позиции переставляем в безубыток и тралим его
   if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
   {
      SetBreakevenForBuyPosition();
      TrailingStopLossForBuyPosition();
   }
   //-- Стоп-лосс короткой позиции переставляем в безубыток и тралим его
   else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
   {
      SetBreakevenForSellPosition();
      TrailingStopLossForSellPosition();
   }
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции BUY в безубыток                         |
//+------------------------------------------------------------------+
void SetBreakevenForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции SELL в безубыток                        |
//+------------------------------------------------------------------+
void SetBreakevenForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+

あとは、関数にその名前に対応するロジックを埋め込むだけです。ご覧の通り、テンプレートは初歩的なものです。そして、構造的にはToRと似ています。

このコードがコンパイルできること、つまりコンパイラから見て正しいことに注意してください。つまり、開発中に小さな変更を加え、その変更後にコンパイルができるようにすることです。また、コンパイラが「0 error, o warnings」と報告するように努めましょう。エラーがあるとプログラムを実行できないことは明らかですが、コンパイラの警告は、「警告があれば修正しなければならない」という、私たちの父の祈りのように受け止めなければなりません。このテンプレートは、0 エラー、o 警告」で作られています- 開発が終了するまでこの状態を保存して ください。

ロジックを理解し、コンパイラを理解したら、あとは関数に必要なロジックを装備するだけです。

2つ目のパラメータであるトレール値については、とりあえず次のバージョンに移行する予定です。追加で計算が必要になります。そのため、このテンプレートには存在しない。トロールは1目盛り ごとに調整されます。

 
Vasiliy Sokolov:

ウラジミール、長い間、それを利用する必要はないんだ。さあ、アクションに入ろう。希望するトレーリングのテンプレートを書いておきました。

あとは、関数にその名前に対応するロジックを埋め込むだけです。ご覧の通り、テンプレートは初歩的なものです。そして、構造的にはToRと似ています。

このコードがコンパイルできること、つまりコンパイラから見て正しいことに注意してください。つまり、開発中に小さな変更を加え、その変更後にコンパイルができるようにすることです。また、コンパイラが「0 error, o warnings」と報告するように努めましょう。エラーがあるとプログラムを実行できないことは明らかですが、コンパイラの警告は、「警告があれば修正しなければならない」という、私たちの父の祈りのように受け止めなければなりません。このテンプレートは、0 エラー、o 警告」で作られています- 開発が終了するまでこの状態を保存して ください。

ロジックを理解し、コンパイラを理解したら、あとは必要なロジックを関数に装備するだけです。

2つ目のパラメータであるトレール値については、とりあえず次のバージョンに移行する予定です。追加で計算が必要になります。そのため、このテンプレートには存在しない。トロールは1ティック ごとに更新されます。

Vasiliyさん、もちろん、これだけの仕事をしてくれていることには感謝したいのですが、これらの関数や演算子がどこから来たのか、そして何より、なぜそこにあるのかを理解する助けにはならないのです。そのコードを書くところまでは、ご提案いただいた方が正解でしたね。自分でも本当にここまでやりたいと思ったし、今はそうしたいと思っています。

他の多くの人と同じように、私が常にコードの行をすべて綴り、その場を踏みにじることにうんざりしているのは理解できますが、問題は、アルゴリズムからコードの書き方まで、すべてがどのように構築されているのかがまだ理解できていないことです。コンパイラのエラーや警告メッセージ、その他の英単語をほとんどすべてGoogle翻訳にコピー&ペーストしなければならないので、英語の知識がないことも問題に加えなければなりません。ちなみに、このスレッドに掲載したマイクロ、ナノコードまで 実行しようとした人がいれば、すべて0エラー、0ワーニング」でコンパイルをパスしています。

今は、なぜこのような関数や演算子が登場したのかを実感というか、理解するのに時間が必要です。要するに、サイレントホラーということですね。そして、初歩的なことが分からないとダメな生徒です。

私の頭の回転の遅さを許容してくれた、あなたや他のプログラマーたちに感謝します。し かし、あなたの忍耐力は無限ではないことを理解しています。

敬具 ウラジミール