ロボットの作成 - ページ 8

 

皆さん、どうもありがとうございました!

現在のチャートにZigZagColorインジケータを作成し、EAを閉じた後にそれを削除するプログラムコードは次のようになります。

EA初期化ブロック内

//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(m_symbol.Name(),Period(),"Examples\\ZigzagColor",
                          Inp_ZZ_Depth,
                          Inp_ZZ_Deviation,
                          Inp_ZZ_Backstep);
   ChartIndicatorAdd(ChartID(),0,handle_iCustom);

Expert Advisor の非初期化ブロックにおいて

(このコードを使用される方への警告 です。このバージョンのコードは中間的なもので、Inp_ZZ_Depth = 80;Inp_ZZ_Deviation = 20;Inp_ZZ_Backstep = 0のインジケータ設定にのみ適用されます; 他の設定では、インジケータは削除されません初期化ブロックの他の設定でインジケータを削除させるには、80,20,0)の代わりにそれらを指定してください。

//---
  ChartIndicatorDelete(0,0,"ZigZag(80,20,0)");

あとは、インジケーターの設定を変更した後に、削除させる方法を理解する必要があります。以下のバリエーションを試してみました。

//---
  ChartIndicatorDelete(0,0,"ZigZag("+Inp_ZZ_Depth+","+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+")");

すべての 設定のインジケータをクリアしますが、EAをコンパイルする際にエディタが数値から文字列への暗黙の変換に関する 警告を3回発生させます。

implicit conversion from 'number' to 'string'   ZigZag_Fibonacci_(M1).mq5       230     38

このような価値観があるからではないでしょうか。"+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+".まあ、MQL5というプログラミング 言語をもっと勉強しないといけないんですけどね。

あらためて、ありがとうございました

敬具 ウラジミール

 
MrBrooklin:

皆さん、どうもありがとうございました!

現在のチャートにZigZagColorインジケータを作成し、EAを閉じた後にそれを削除する最終的なコードは次のようになります。

EA初期化ブロック内

EA の非初期化ブロックにおいて

(このコードを使用される方への警告 です。このバージョンのコードは中間的なもので、Inp_ZZ_Depth = 80;Inp_ZZ_Deviation = 20;Inp_ZZ_Backstep = 0のインジケータ設定にのみ適用されます; 他の設定では、インジケータは削除されません初期化ブロックの他の設定でインジケータを削除させるには、80,20,0)の代わりにそれらを指定してください。

あとは、インジケーターの設定を変更した後に、削除させる方法を理解する必要があります。以下のバリエーションを試してみました。

すべての 設定のインジケータをクリアしますが、EAをコンパイルする際にエディタが数値から文字列への暗黙の変換に関する 警告を3回発生させます。

このような価値観があるからではないでしょうか。"+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+".まあ、MQL5というプログラミング 言語をもっと勉強しないといけないんですけどね。

あらためて、ありがとうございました

敬具 ウラジミール

 ChartIndicatorDelete(0,0,"ZigZag("+(string)Inp_ZZ_Depth+","+(string)Inp_ZZ_Deviation+","+(string)Inp_ZZ_Backstep+")");

暗黙の型変換の警告 厳密な実装では、暗黙の型変換は警告を与える。

明示的に入力する必要があります。そして、MT5では常に厳密な実行です。MT4では、プロパティで選択と非指定が可能です #property strict

 
SanAlex:

私は独学で勉強しています - そして私は利用可能なコードから自分自身をコピーします、 - 問題は、私はどのように彫刻する方法を説明する方法を知らないということです!?- 自分の中にある何かが、どう彫ればいいのかを教えてくれる。

----------------------------------

私が成型したものは、そこに欠けている、ライン用のトロールも知っています。

トロールを追加しました。

input string   t0="---- Trailing Line:      -----";              //
input ushort   InpObjTrailingStop           = 0;                 // Obj: Trailing Stop (distance from price to object, in pips)
input ushort   InpObjTrailingStep           = 0;                 // Obj: Trailing Step, in pips (1.00045-1.00055=1 pips)
input string   t1="---- Line Name           -----";              //
input string   InpObjUpName                 = "Имя Линии Up";    // Obj: Up (Trailing Horizontal Line) or Trend Line)
input ENUM_TRADE_COMMAND InpTradeCommand    = UpName_s;          // Obj:  command: UP
input string   InpObjDownName               = "Имя Линии Down";  // Obj: Down (Trailing Horizontal Line) or Trend Line)
input ENUM_TRADE_COMMAND InTradeCommand     = DownName_b;        // Obj:  command: DOWN
input ushort   InpObjStep                   = 15;                // Obj: Step (distance from price to object, in pips)
ファイル:
0006.mq5  109 kb
 
Valeriy Yastremskiy:

明示的でない型変換に関する警告。ストレート(ストリクト)実行の場合、明示的でない型変換は警告を発します。

明示的に型をキャストする必要があります。そして、MT5では常に厳密な実行です。MT4では、プロパティで選択と非指定が可能です #property strict

ヴァレリーさんのおっしゃる通りです。この形であれば、すべてが思い通りに動きます。最終版 をEA初期化ブロックの中に入れてください。

//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(m_symbol.Name(),Period(),"Examples\\ZigzagColor",
                          Inp_ZZ_Depth,
                          Inp_ZZ_Deviation,
                          Inp_ZZ_Backstep);
   ChartIndicatorAdd(ChartID(),0,handle_iCustom);

をEA非初期化ブロックの中に入れてください。

ChartIndicatorDelete(0,0,"ZigZag("+(string)Inp_ZZ_Depth+","+(string)Inp_ZZ_Deviation+","+(string)Inp_ZZ_Backstep+")");

ご指摘ありがとうございます。

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

 
Роман Жилин:

おおっ、ありがとうございます!これだけ情報があれば、いろいろなことができそうですね...。

ちょうど出張 があるので、もらった資料を深堀りしようと思っているのですが、コーデが...。紙の上でもできるんだから、いいトレーニングになるのに・・・。


ローマン

皆さん、ごきげんよう。

ローマンは出張中でこのトピックに参加していませんが、代わりにプログラミング言語MQL5に関する質問を続けていきます。CodeBaseの Maximum Percentage of Equity Riskの ライブラリ(https://www.mql5.com/ru/code/2142)を発見しました。 私は、単純なExpert Advisorで買いポジションと売りポジションのオープンを、固定ロットではなく、株式リスクの最大割合で実装してみることにしました。

以下はソースコードです(メインタスクに集中するため、不要なものはすべて削除しました)。

//+------------------------------------------------------------------+
//|                                                  11111111111.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"

input int      TakeProfit=300; //Тейк-профит
input int      StopLoss=250;  //Стоп-лосс
input double   lot=0.1;        //Лот

double Ask;
double Bid;
//+------------------------------------------------------------------+
//| Функция открытия длинной (Long) позиции.                         |
//+------------------------------------------------------------------+
int OpenLong(double volume=0.1,
             int slippage=10,
             string comment="Long",
             int magic=0)
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   ZeroMemory(my_trade);
   my_trade.action=TRADE_ACTION_DEAL;
   my_trade.symbol=Symbol();
   my_trade.volume=NormalizeDouble(volume,1);
   my_trade.price=NormalizeDouble(Ask,_Digits);
   my_trade.sl=NormalizeDouble(Ask-StopLoss*_Point,_Digits);
   my_trade.tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   my_trade.deviation=slippage;
   my_trade.type=ORDER_TYPE_BUY;
   my_trade.type_filling=ORDER_FILLING_FOK;
   my_trade.comment=comment;
   my_trade.magic=magic;
   ResetLastError();

   if(OrderSend(my_trade,my_trade_result))
     {
      Print("Код результата операции - ",my_trade_result.retcode);
     }
   else
     {
      Print("Код результата операции - ",my_trade_result.retcode);
      Print("Ошибка открытия ордера = ",GetLastError());
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| функция открытия короткой (Short) позиции.                       |
//| Аналогична функции открытия длинной позиции.                     |
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick()
  {
.   double Open[];
.
.
         if(Open[1]>(Open[2]))
           {
            OpenShort(lot,10,"Short",1234);
            return;
           }
         if((Open[1]<Open[2])
           {
            OpenLong(lot,10,"Long",1234);
            cantrade=false;
            return;
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+

そこに指定されたライブラリのコードを挿入した。以下のコードを取得しました。

//+------------------------------------------------------------------+
//|                                                  11111111111.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"

#include <Trade\SymbolInfo.mqh> // добавлено из библиотеки

input int      TakeProfit=300; //Тейк-профит
input int      StopLoss=250;  //Стоп-лосс
input double   lot=0.1;        //Лот
input double   MaximumPercentageRisk=25; //Риск - добавлено из библиотеки

bool UseMaximumPercentageRisk=true; // добавлено из библиотеки
double Ask;
double Bid;
//--- этот блок добавлен из библиотеки
//+------------------------------------------------------------------+
//|  GetLotSize RPTrade                                              |
//+------------------------------------------------------------------+
double GetLotSize(double lotsize)
  {
//--- Gets pair specs  
   CSymbolInfo symInfo;
   int  digits_bn=symInfo.Digits();
   double  points_bn=symInfo.Point();
   string symbol_bn=_Symbol;
//--- adjust lot 
   int tmpdecimal=1;
   double old_lot=lotsize;
//---
   if((NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*(MaximumPercentageRisk/100)/1000.0,tmpdecimal)<lotsize) 
   && UseMaximumPercentageRisk) //лот подходит под риск ?
     {
      lotsize=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)
      *(MaximumPercentageRisk/100)/1000.0,tmpdecimal);  //расчет нового размера лота 

      if(lotsize<SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_MIN)) //размер лота подходит под минимльный размер лота брокера ?
        {
         lotsize=SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_MIN); //Нет! Настройка размера лота под минимальный размер лота брокера
         Print(_Symbol," Lot adjusted from ",old_lot," для уменьшения размера разрешенного сервером ",lotsize);
        }
      else
        {
         Print(_Symbol," Lot adjusted from ",old_lot,
         " to ",lotsize," для соответствия условию максимального риска. В каждой сделке рисковать можно только ",
         MaximumPercentageRisk,"% от свободной маржи.");   //Да! 
         if(MathAbs(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)
         -MathRound(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)))>1.0 E-10) //Размер лота подходит под разрешенный шаг брокера ?
           {
            lotsize=SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)
            *NormalizeDouble(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP),0);   //НЕТ! Перерасчет размера лота.    
            Print("M-",_Symbol," Warning: Your calculated percentage at risk lot size of was not a multiple of minimal step",
            SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP),". Размер лота изменился до",lotsize);
           }
        }
     }
   return(lotsize);
 }

//+------------------------------------------------------------------+
//| Функция открытия длинной (Long) позиции.                         |
//+------------------------------------------------------------------+
int OpenLong(double volume=0.1,
             int slippage=10,
             string comment="Long",
             int magic=0)
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   ZeroMemory(my_trade);
   my_trade.action=TRADE_ACTION_DEAL;
   my_trade.symbol=Symbol();
   my_trade.volume=NormalizeDouble(volume,1);
   my_trade.price=NormalizeDouble(Ask,_Digits);
   my_trade.sl=NormalizeDouble(Ask-StopLoss*_Point,_Digits);
   my_trade.tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   my_trade.deviation=slippage;
   my_trade.type=ORDER_TYPE_BUY;
   my_trade.type_filling=ORDER_FILLING_FOK;
   my_trade.comment=comment;
   my_trade.magic=magic;
   ResetLastError();

   if(OrderSend(my_trade,my_trade_result))
     {
      Print("Код результата операции - ",my_trade_result.retcode);
     }
   else
     {
      Print("Код результата операции - ",my_trade_result.retcode);
      Print("Ошибка открытия ордера = ",GetLastError());
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| функция открытия короткой (Short) позиции.                       |
//| Аналогична функции открытия длинной позиции.                     |
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick()
  {
.   double Open[];
.
.
         if(Open[1]>(Open[2]))
           {
            OpenShort(lot,10,"Short",1234);
            return;
           }
         if((Open[1]<Open[2])
           {
            OpenLong(lot,10,"Long",1234);
            cantrade=false;
            return;
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+

しかし、Expert Advisorは固定ロットで動作し続ける、つまり、リスクは考慮されません。キャピタルゲインのリスク率を上げるにはどうしたらいいかアドバイスください。

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

Maximum Percentage of Equity Risk
Maximum Percentage of Equity Risk
  • www.mql5.com
Change Chart and Timeframe Модифицированные скрипты для быстрого изменения графиков и таймфреймов на всех графиках при помощи горячих клавиш. Apply Template Простой скрипт для применения шаблона и/или таймфрейма ко всем открытым графикам. Long position Простой скрипт...
 
皆さん、このスレッド全体で議論されているのは1ページだけで、あとはコードです。コードを入れるだけ ではダメなのでしょうか?
 
MrBrooklin:

皆さん、ごきげんよう。

Romanが出張中でこのスレッドに積極的に参加していない間、代わりにプログラミング言語MQL5について質問を続けていきます。CodeBaseの Maximum Percentage of Equity Riskの ライブラリ(https://www.mql5.com/ru/code/2142)を発見しました。 私は、単純なExpert Advisorで買いポジションと売りポジションのオープンを、固定ロットではなく、株式リスクの最大割合で実装してみることにしました。

以下はソースコードです(メインタスクに集中するため、不要なものはすべて削除しました)。

そこに指定されたライブラリのコードを挿入した。以下のコードを取得しました。

しかし、Expert Advisorは固定ロットで動作し続ける、つまり、リスクは考慮されません。キャピタルゲインのリスク率を上げるにはどうしたらいいかアドバイスください。

尊敬するウラジミール

あなたの書き方だと、そういうことになりますね。行が必要で、もしLot=0なら、危険なロットをカウントし、最後に計算値を変数Lotに代入します。

第四紀ではこのように、追加変数Ltsを通して

bool CheckMoneyForTrade()
 {
 RefreshRates();                              // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера
 
   if (Lots > 0)                                // Если заданы лоты,то 
      Lts =Lots;                                // с ними и работаем 
   else                                         // % свободных средств
      Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия
 
   if(Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                      // Лот дороже свободн.
     {
      Alert(" Not enough money for ", Lts," lots");
     Work=false;
      return(false) ;                                   // Выход из функции()
     }
     return(true);
     }
 
VVT:
諸君、この話題は全部で1ページ、あとはコードだ。コードを入れるだけ ではダメなのでしょうか?

では、どのように支援するのか?

 
SanAlex:

では、どのように支援するのか?

要求されたものだけを入れる

 
Valeriy Yastremskiy:

このように書かれており、どのように機能するのかがわかります。もしLot=0なら、危険なロットをカウントし、最後に計算値を変数Lotに代入する行が必要です。

第四紀では、追加変数Ltsを通して、このようになります。

ヴァレリーさん、ありがとうございます!夕方から試してみます。

敬具 ウラジミール