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

 
Maxim Kuznetsov:

...ここの人たちは、一応新人を助けようとしてくれている。

皆さん、ご機嫌いかがでしょうか?

私を助けようとしてくれている皆さん、ありがとうございます あなたの力を借りた結果は、すでにそこにある。今は意識的に必要な情報(チュートリアルやWebサイトのドキュメントなど)を探すようになったので、独学を継続するのに役立っています。このスクリプトのコードを書くのに使ったのはMQL5のリファレンスだけであることを強調したい。

今日は、New6.mq5スクリプトを改良したNew7.mq5スクリプトのコードを貼り付けます。新しいスクリプトでは、ストップロス(損切り)とテイクプロフィット(利益確定)のレベルを設定することができます。このスクリプトでは、先ほど約束したように、小学1年生のプログラマーにも理解できる形ですべてを記述するように心がけました。

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

//+------------------------------------------------------------------+
//|                                                         New7.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
//---
/* Продолжаем изучение языка программирования MQL5. В этот раз мы добавим в код скрипта, созданный
   нами ранее под именем New6.mq5, возможность устанавливать уровни Stop Loss (остановить убыток)
   и Take Profit (взять прибыль). Данные уровни позволят в ходе торговли автоматизировать процесс
   ограничения убытков и фиксации прибыли в то время, когда у нас отсутствует возможность находиться 
   перед торговым терминалом. Во входных параметрах скрипта создадим две переменные: SL (стоп лосс)
   и TP (тейк профит). Для них применим модификатор input и тип данных double. Чтобы постоянно не
   повторять комментарии, написанные в предыдущем скрипте New6.mq5, мы уберем всё лишнее и будем
   пояснять только те участки кода, которые добавим в данном скрипте. Итак, приступим. По нашей
   задумке нужно написать часть кода скрипта, который будет отвечать за Stop Loss и Take Profit.
   Снова обращаемся к Справочнику MQL5, в котором ищем раздел MqlTradeRequest. В нём мы находим
   информацию о том, что необходимо создать ещё два запроса: request.sl (для уровня Stop Loss ордера)
   и request.tp (для уровня Take Profit ордера). Дописываем в скрипт недостающие части кода.*/

/* Добавим в код скрипта необходимые переменные SL и TP.*/
input double SL=300;                 //Стоп лосс
input double TP=500;                 //Тейк профит
//---
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);
     {
      request.type=ORDER_TYPE_BUY_STOP;
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)+Distance*point;
      request.price=NormalizeDouble(price,digits);

/* Теперь создаем два запроса на торговый сервер: request.sl и request.tp, в котором указываем, где
   должны находиться уровни стоп лосс и тейк профит относительно цены отложенного ордера "BUY_STOP".
   Уровень SL должен быть ниже цены (поэтому пишем price-SL*point), а уровень TP должен быть выше цены
   (поэтому пишем price+TP*point). Для нормализации уровней SL и TP мы применим функцию преобразования
   данных NormalizeDouble, где обязательно умножим каждый из уровней на point (размер одного пункта)
   и укажем digits (количество знаков после запятой).*/
      request.sl=NormalizeDouble(price-SL*point,digits);      
      request.tp=NormalizeDouble(price+TP*point,digits);
//---
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
     {
      request.type=ORDER_TYPE_SELL_STOP;
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-Distance*point;
      request.price=NormalizeDouble(price,digits);
      
/* Точно также создадим ещё два новых запроса на торговый сервер: request.sl и request.tp, в котором укажем,
   где должны находиться уровни стоп лосс и тейк профит относительно цены отложенного ордера "SELL_STOP".
   Уровень SL теперь должен находиться выше цены (поэтому пишем price+SL*point), а уровень TP должен 
   находиться ниже цены (поэтому пишем price-TP*point). Снова для нормализации уровней SL и TP мы применим
   функцию преобразования данных NormalizeDouble, где обязательно умножим каждый из уровней на point (размер
   одного пункта) и укажем digits (количество знаков после запятой).*/
      request.sl=NormalizeDouble(price+SL*point,digits);      
      request.tp=NormalizeDouble(price-TP*point,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }

/* Всё! Наш новый скрипт готов. Компилируем и запускаем скрипт. Как компилировать и запускать скрипт мы
   уже узнали, когда создавали скрипт New2.mq5.*/

//+------------------------------------------------------------------+
 
MrBrooklin:

皆さん、ご機嫌いかがでしょうか?

私を助けようとしてくれている皆さん、ありがとうございます 皆さんの協力で、すでに結果がでています。今は意識的に必要な情報(チュートリアルやWebサイトのドキュメントなど)を探し、それを元に独学を続けています。このスクリプトのコードを書くのに使ったのはMQL5のリファレンスだけであることを強調したい。

今日は、New6.mq5スクリプトを改良したNew7.mq5スクリプトのコードを貼り付けます。新しいスクリプトは、ストップロス(損切り)とテイクプロフィット(利食い)のレベルを設定する機能を備えています。このスクリプトでは、先ほど約束したように、小学1年生のプログラマーにも理解できる形ですべてを記述するように心がけました。

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

あなたのコードに一行があります。

#define       orderType1 "BUY_STOP"   //Тип ордера UP

コード中に「orderType1」がある場合、「BUY_STOP」に置き換わるということです。

つまり、次の行の代わりに

if( orderType1 == "BUY_STOP" )

"BUY_STOP "は以下の文字列に置き換わります。

if( "BUY_STOP" == "BUY_STOP" )

それが、あなたが本当に望んでいることなのでしょうか?

 
Koldun Zloy:

あなたのコードに一行があります。

これは、コード内で'orderType1'に遭遇した場合、'BUY_STOP'に置き換わることを意味します。

そこで、次のような行に代えて

文字列になります。

これが、あなたが本当に望んでいることですか?

今一度ドキュメントを勉強して、後日回答します。

敬具 ウラジミール

 

Koldun Zloy:

...本当にそれでいいのでしょうか?

今のところ、そうですね。

ウラジミールさん、謹んで申し上げます。

 
MrBrooklin:

今のところ、そうですね。

さあ、どうぞ...

 
Vasiliy Sokolov:

さあ、いよいよだ...。

えっと、何て言ったっけ...))))ベースがあって、またベースがあるはずです。まず3~4ヶ月間、教科書を読む・読んで、それから何かを書くということをしなければなりません。1年後にはOOPを開始することができます。
 
MrBrooklin:

当面は、そうですね。

ウラジミールさん、謹んで申し上げます。

この点は、もっと詳しく書くべきでした。確かに作業用オプションではあるが、あまりに意外すぎる))))

スクリプトが何をするのか、アルゴリズムを模式的に説明することから始めるのがよいでしょう。質問も少なく、具体的な発言も多くなります)

 
MrBrooklin:

当面は、そうですね。

ウラジミールさん、謹んで申し上げます。

実は、上の条件は、2=2のように常に真なのです。そのため、ここではif(条件演算子)が機能せず、そのようなコードにはコンパイラが警告を発します。
 
Реter Konow:
さて、どんな話をしたのでしょうか)))ベースがあり、またベースがあるはずです。まず3-4ヶ月間、教科書を読む/復習する、そして何かを書く。1年後にはOOPを開始することができます。

ベースがどうのこうのという話でもない。この人の頭の中は混乱してる。船は沈んでしまったが、帆(利食い、損切り、将来の引きずり込み)はそれに合わせて慎重に形を整えているところだ。

ReTeg Konow:
実は上の条件は、2=2のように常に真なのです。そのため、if(条件演算子)はここでは機能せず、そのようなコードにはコンパイラが警告を出します。

あとは枝の作者がピーターさんのアドバイスに従って、「そういうことか、俺はアーティストなんだ!」と言えばいい。

 
Vasiliy Sokolov:

さあ、どうぞ...

そんな反応をされたのだから、何か勘違いしているのだろう。

スクリプトNew6.mq5に「保留中の注文Buy StopとSell Stopについて、inputの代わりに#defineディレクティブを適用する」という条件を 書きました。これにより、スクリプトのコードで必要なタイプの未決済注文を指定することができますが、実行時にスクリプトの入力パラメータに 表示されることはありません。注文の種類を定義する変数 orderType1 と orderType2 を設定しましょう。これらの変数に「BUY_STOP」「SELL_STOP」という名前をつけてみましょう。

この条件の 実装で何が間違っていたのか、アドバイスをお願いします。

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