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

 
MrBrooklin:

今後、自習計画に従って、段階的に スクリプトを修正していくことが課題となる、すなわち。

  1. ストップロスとテイクプロフィットを追加する。
  2. は、末尾を追加します。
  3. 最大限のリスクを追加する。
  4. 保留中の注文の 範囲を拡大する。
Sincerely, Vladimir.
.
もちろん、チュートリアルのアドバイスに従わなかったのは残念なことです。ラインや注文の入れ方などは学べますが、理論的なベースがないため、とにかくストラテジーが書けなくなります。このようなラインやスクリプトばかりでは、基本的なプログラミングの内容を理解することはできませんし、それなしには遠くへ行くことはできません。最初の4ヶ月は、何も書こうとせず、ただ勉強することに費やしました。もちろん、あなたのように図々しくしてもいいのですが、そうした知識の質は低く、基本に隙間が多いので、これから埋めていかなければならない......。
 
Реter Konow:
もちろん、チュートリアルのアドバイスに従うべきではありませんでした。ラインやオーダーの設定方法などの知識は得られても、理論的なベースがないため、とにかく戦略を練ることができないのです。このようなラインやスクリプトばかりでは、基本的なプログラミングの内容を理解することはできませんし、それなしには遠くへ行くことはできません。最初の4ヶ月は、何も書こうとせず、ただ勉強することに費やしました。もちろん、あなたのように図々しくてもいいのですが、そういう知識の質は低いですから。基本には常に隙間があり、それを将来的に埋めていかなければならない...。

ピーターさん、こんにちは。教科書は必要に応じて、つまり自分の知識にギャップがあるときに勉強しています。今、少し間を置いて、教科書をもっとよく勉強しなければならないと感じています。フォーラム参加者からの推奨はすべて考慮に入れており、それを守るようにしています。そして今、このように短期間にMQL5 Reference bookだけを使って 何かを書くことができたことに驚きを感じています。

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

 
MrBrooklin:

皆さん、こんばんは!ご機嫌いかがでしょうか?

新しいスクリプトNew6.mq5を貼り付けます。このスクリプトは、現在のチャート上の現在の価格から一定の距離に、固定ロットサイズのSellStopとBuyStopの保留注文を一つずつ配置するのに役立ちます。このスクリプトでは、先ほど約束したように、小学1年生のプログラマーにもわかりやすいように、すべてを記述するように心がけました。

MQL5 Referenceから 引用した情報は、スクリプトを書くときだけ使用しました

ウラジミールさん、よろしくお願いします。

これは良い例です。そのきっかけとして使うことをお勧めします。基本中の基本。

MrBrooklin:

今後、自習計画に従って、段階的に スクリプトを修正することが課題となる、すなわち

  1. ストップロスとテイクプロフィットを追加する。
  2. は、末尾を追加します。
  3. 最大限のリスクを追加する。
  4. 保留中の注文の 選択を拡大する。
Sincerely, Vladimir.
.

いいえ、違います。新機能はまだ接続しないでください。今度は既存のロジックを改良する。同時に、スクリプト実装の問題点を解消してください(すでに出ています)。何を書き換えたらいいのか知りたいなら、教えてあげよう。

 
Vasiliy Sokolov:

お手本になりますね。そのきっかけとして使うことをお勧めします。ベースライン

いいえ、違います。まだ新しい機能を差し込まないでください。今度は既存のロジックを改良する。同時に、スクリプト実装の問題(すでに出ています)も解消してください。具体的に何を書き換える必要があるのか、もしご興味があれば、お教えしますよ。

Vasilyさん、こんにちは。もちろん、書き直した方がいいところを教えてください!面白いですよ。

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

 
MrBrooklin:

Vasilyさん、こんにちは。もちろん、何を書き換える必要があるのか教えてください!とても興味があります。

敬具 ウラジミール

プログラマは、コンパイラが出すエラーと、アーキテクチャの問題という2つの問題を抱えています。初心者のうちはコンパイラとの戦いに集中し、最終目標は正しく動作するプログラムです。しかし、初心者のプログラムはあっという間に、作者自身がすぐに理解できない、いわゆるスパゲッティコードになってしまう。ですから、コンパイラや最終的なスクリプトの正しさではなく、アーキテクチャの問題に注目することをお勧めします。ピアノを習うように、まずは正しい指の持ち方と楽器の座り方を覚える。初心者にバッハの演奏を求める人はいない。

//+------------------------------------------------------------------+
//|                                                         New6.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"
//---
#property script_show_inputs
//---

#define       orderType1 "BUY_STOP"   //Тип ордера UP
#define       orderType2 "SELL_STOP"  //Тип ордера DOWN
input int    Distance=100;           //Отступ отложенного ордера от текущей цены
input double Lots=0.01;              //Фиксированный размер лота
input long   Pending_magic=86513;    //Магический номер ордера

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()                                                    
  {
   MqlTradeRequest request={0};
   MqlTradeResult result={0};
   request.action=TRADE_ACTION_PENDING;
   request.symbol=Symbol();
   request.volume=Lots;
   request.deviation=2;
   request.magic=Pending_magic;
   double price;
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   if(orderType1=="BUY_STOP")
     {
      request.type=ORDER_TYPE_BUY_STOP;
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)+Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   if(orderType2=="SELL_STOP")
     {
      request.type=ORDER_TYPE_SELL_STOP; 
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }

スクリプトの動作を決定するパラメータは2種類あり、1つ目はマクロとして静的に設定します。2つ目は、チャート上にスクリプトをロードする際に ユーザーが設定するものです。このため、このスクリプトを再コンパイルしないと、ユーザーは発注する注文の種類を選択することができません。これはまずい。したがって、これらのマクロを捨てて、追加パラメータを使用する方がよいでしょう。

enum ENUM_ORDER_TYPE_FLAGS
{
    BuyStop = 1,                // Только BuyStop
    SellStop = 2,               // Только SellStop
    BuyStopAndSellStop = 4      // BuyStop и SellStop
};

input ENUM_ORDER_TYPE_FLAGS TypeSendOrders = BuyStop;   // Тип Выставляемого ордера(ов)

そこで、新たに列挙型を定義し、それをユーザーの選択パラメータとして実装しました。

 
Vasiliy Sokolov:

プログラマは、コンパイラのエラーとアーキテクチャの問題という2つの問題を抱えています。初心者のうちは、コンパイラと戦うことに集中し、最終的な目標は正しく動作するプログラムです。しかし、初心者のプログラムはあっという間に、作者自身がすぐに理解できない、いわゆるスパゲッティコードになってしまう。ですから、コンパイラや最終的なスクリプトの正しさではなく、アーキテクチャの問題に注目することをお勧めします。ピアノを習うように、まずは正しい指の持ち方と楽器の座り方を覚える。初心者にバッハの演奏を求める人はいない。

スクリプトの動作を決定するパラメータは2種類あり、1つ目はマクロとして静的に設定します。2つ目は、チャート上にスクリプトをロードする際に ユーザーが設定するものです。このため、このスクリプトを再コンパイルしないと、ユーザーは注文の種類を選択することができません。これはまずい。したがって、これらのマクロを捨てて、パラメータを追加する方がよいでしょう。

そこで、新たに列挙型を定義し、それをユーザーの選択パラメータとして実装しました。

素晴らしい、実際、スクリプトのステップバイステップの改造のステップ 4に書かれていること、すなわち、保留中の注文の 選択を拡大することを促してくれたのです。

ありがとうございました。

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

 

あなたのコードの次の問題は、それが長い手続き的なシートに広がっていることです。初心者はみんなこう書くんです。そして、これは何年も残る問題なのです。このスクリプトのように基本的なところから、アルゴリズムをパーツに分解することを学びます。その方法には、関数とクラスの2つがあります。最初はクラスの概念が難しすぎるので、関数を扱うことに重点を置くといいと思います。機能の重要性を考える。

  • MQLで書かれたすべてのコード(例えばCodeBaseのすべてのスクリプト、インジケーター、Expert Advisorなど)は、システム関数内かユーザー関数内のどちらかです。
  • どんなMQLコードでも、何十ものビルトインMQL関数を呼び出すことができます。MetaTraderとその取引環境とのすべての相互作用は、システム関数の呼び出しを通じて実行されます。
  • 外部パラメータに依存しない関数は、常に同じ結果を返します。このような機能は、あるスクリプト/インジケータ/アドバイザから別のスクリプトにコピーするだけで、正しく動作します。一方、手続き的なコードの任意の部分をコピーすることは、うまくいかない可能性が高いです。
  • 便利な仕事をするカスタム関数は、自由に書くことができます。そうすることで、MQLの標準的な機能を必要な形で拡張することができるのです。例えば、「MQLにこんな機能があったらかっこいいな......」と思うことがあると思います。- でも、なぜ自分で書かないのか?
 
Vasiliy Sokolov:

あなたのコードの次の問題は、それが長い手続き的なシートに広がっていることです。初心者はみんなこう書くんです。そして、これは何年も残る問題なのです。このスクリプトのように基本的なところから、アルゴリズムをパーツに分解することを学びます。その方法には、関数とクラスの2つがあります。最初はクラスの概念が難しすぎるので、関数を扱うことに重点を置くといいと思います。機能の重要性を考える。

  • MQLで書かれたすべてのコード(例えばCodeBaseのすべてのスクリプト、インジケーター、Expert Advisorなど)は、システム関数内かユーザー関数内のどちらかです。
  • どんなMQLコードでも、何十ものビルトインMQL関数を呼び出すことができます。MetaTraderとその取引環境とのすべての相互作用は、このまたはそのシステム関数の呼び出しを通じて実行されます。
  • 外部パラメータに依存しない関数は、常に同じ結果を返します。このような機能は、あるスクリプト/インジケータ/アドバイザから別のスクリプトにコピーするだけで、正しく動作します。一方、手続き的なコードの任意の部分をコピーすることは、うまくいかない可能性が高いです。
  • 便利な仕事をするカスタム関数は、自由に書くことができます。そうすることで、MQLの標準的な機能を必要な形で拡張することができるのです。例えば、「MQLにこんな機能があったらかっこいいな......」と思うことがあると思います。- でも、なぜ自分で書かないのか?

Vasilyさん、このような包括的なアドバイスをありがとうございました。必ずやそれを踏まえて、ベストを尽くしたいと思います。

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

 
Vasiliy Sokolov:

あなたのコードの次の問題は、それが長い手続き的なシートに広がっていることです。初心者はみんなこう書くんです。そして、これは何年も残る問題なのです。このスクリプトのように基本的なところから、アルゴリズムをパーツに分解することを学びます。その方法には、関数とクラスの2つがあります。最初はクラスの概念が難しすぎるので、関数を扱うことに重点を置くといいと思います。機能の重要性を考える。

  • MQLで書かれたすべてのコード(例えばCodeBaseのすべてのスクリプト、インジケーター、Expert Advisorなど)は、システム関数内かユーザー関数内のどちらかです。
  • どんなMQLコードでも、何十ものビルトインMQL関数を呼び出すことができます。MetaTraderとその取引環境とのすべての相互作用は、システム関数の呼び出しを通じて実行されます。
  • 外部パラメータに依存しない関数は、常に同じ結果を返します。このような機能は、あるスクリプト/インジケータ/アドバイザから別のスクリプトにコピーするだけで、正しく動作する。一方、手続き的なコードの任意の部分をコピーすることは、うまくいかない可能性が高い。
  • 便利な仕事をするカスタム関数は、自由に書くことができます。そうすることで、MQLの標準的な機能を必要な形で拡張することができるのです。例えば、「MQLにこんな機能があったらかっこいいな......」と思うことがあると思います。- でも、なぜ自分で書かないのか?
ワシリー、この人はまだアレイを使いこなせていないんだ。そのような講義を聞くにはまだ早すぎる)。
 
Реter Konow:
ワシリー、この人はまだアレイを使いこなせていないんだ。そのような講義を聞くにはまだ早すぎる)。

ピーターさん、あなたからのアドバイスも含め、建設的なものはすべて私にとって重要です。

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