ライブラリ: MT4Orders - ページ 78

 

私は自分のクラスで次のようなエラー処理を行った。

#property strict

#ifdef __MQL5__
#include <MQL4_To_MQL5.mqh> //https://www.mql5.com/ja/code/16006
#endif // __MQL5__

#define GetLastError GetOrderError
// MT5 だけでなく MT4 にも存在しなければならない。
// https://www.mql5.com/ru/forum/93352/page19#comment_6730221
#include <MT4Orders.mqh>

#define  BUY     0
#define  SELL    1
#define  ALL    -1
#define  LAST    0
#define  NOMODY  -1
bool LogInfo=true;// エラー・ログへのプリント
/*
以下は、注文を扱うためのクラスの関数です
*/

クラスの最後に関数

//+-------------------------------------------------------------------------------------------------------------------+
//|| MT5からMT4へのエラー変換
//+-------------------------------------------------------------------------------------------------------------------+
int GetOrderError()
{
//int error=MT4ORDERS::LastTradeResult.retcode_external; // カスタムコードを返す。
   int error=(int)MT4ORDERS::LastTradeResult.retcode; // 注文をサーバーに送信した後、エラーコードを返す。
   if(LogInfo==true)Print("error MT5=",error);
   switch(error)
   {
   case 10016:
      error=130;//足が違う
      break;
   case 10018:
      error=132;//市場閉鎖
      break;
   case 10020:
      error=135;//価格が変更されました
      break;
   case 136:
      error=136;//価格がない - MT5にコードがない
      break;
   case 10004:
      error=138;//新価格
      break;
   case 145:
      error=145;//注文がマーケットに近すぎるため、修正が禁止されています。
      break;
   case 146:
      error=146;/トレーディングサブシステムがビジー - MT5にコードがない
      break;
   default:
      error=error;//記述されていないエラー
   }
   return (error);
}
#undef GetLastError
 
Aleksey Vyazmikin #:

私のクラスでのエラー処理は次のようにした。

クラスの最後に関数

悪くないバリアントだ。ただ、他のエラー・コードは 利用できないことを覚えておいてほしい。

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения
  • www.mql5.com
Ошибки времени выполнения - Коды ошибок и предупреждений - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber #:

悪い選択肢ではない。ただ、他のエラーコードは 使用できないことを覚えておいてほしい。

私の理解が正しければ、コンパイラーはGetLastErrorを置き換えることはもうないだろう。

 
Aleksey Vyazmikin #:

この変更は私のクラスの周りのコードにのみ有効で、#undef GetLastErrorという置換をオフにした後は、私の理解が正しければ、コンパイラはGetLastErrorをそれ以上置き換えないようです。

あなたの言うとおりです。私はあなたの言っている意味が一度で理解できませんでした。

 
fxsaber #:

その通りだ。何が言いたいのかすぐには分からなかった。

ありがとう!あとはテストするだけだ :)

 

コロンとクエスチョンマークばかりでよくわかりません。

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume)
  {
   double Margin;

   return(::OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume,
          ::SymbolInfoDouble(Symb,(Cmd==::ORDER_TYPE_BUY) ? ::SYMBOL_ASK : ::SYMBOL_BID),Margin) ?
          ::AccountInfoDouble(::ACCOUNT_MARGIN_FREE) - Margin : -1);
  }

資金9k、レバレッジ1k100、ロット0.01で、ゼロより小さい値を返します。

 

ログに情報を印刷

/+------------------------------------------------------------------+
//|注文を出すのに十分な資金があるかチェックする。
//+------------------------------------------------------------------+ 
bool CheckMoneyForTrade(double lots,int type)
  {
   string symb=Symbol();
   double free_margin=AccountFreeMarginCheck(symb,type,lots);

   double MarginAsk=0.0;
   bool MarginAskB=OrderCalcMargin(ENUM_ORDER_TYPE(type),Symbol(),lots,SymbolInfoDouble(Symbol(),SYMBOL_ASK),MarginAsk);
   double MarginBid=0.0;
   bool MarginBidB=OrderCalcMargin(ENUM_ORDER_TYPE(type),Symbol(),lots,SymbolInfoDouble(Symbol(),SYMBOL_BID),MarginBid);
   
   Print("ACCOUNT_MARGIN_FREE=",AccountInfoDouble(ACCOUNT_MARGIN_FREE),
   " SYMBOL_ASK=",SymbolInfoDouble(Symbol(),SYMBOL_ASK),
   " SYMBOL_BID=",SymbolInfoDouble(Symbol(),SYMBOL_BID),
   " OrderCalcMarginAsk=",MarginAsk,
   " OrderCalcMarginBid=",MarginBid, 
   " free_margin=",free_margin 
   );


   //-- 十分な資金がない場合
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
     if(NewOrderAllowedVolume(Symbol())<(lots+0.1))return(false);//利用可能な容量を確認する
  
   //-- テストは成功した
   return(true);
  }

テスターで

2022.07.22 21:50:39.521 2009.12.04 14:30:00   ACCOUNT_MARGIN_FREE=999560.05 SYMBOL_ASK=89.63 SYMBOL_BID=89.6 OrderCalcMarginAsk=100.0 OrderCalcMarginBid=100.0 free_margin=999460.05

実生活では

2022.07.22 21:45:08.956 Bingo_MT5 (USDJPY,M15)  ACCOUNT_MARGIN_FREE=9000.0 SYMBOL_ASK=136.267 SYMBOL_BID=136.241 OrderCalcMarginAsk=0.0 OrderCalcMarginBid=0.0 free_margin=-1.0
2022.07.22 21:45:08.956 Bingo_MT5 (USDJPY,M15)  Not enough money for Buy 0.0 USDJPY Error code=4002

未知の理由により、OrderCalcMargin() の計算が行われていないようです。

エラー4002とは

クライアント端末関数の 内部呼び出しの パラメータに誤りがあります。

という意味なのですが、意味がよくわかりません。

 
Aleksey Vyazmikin #:

コロンとクエスチョンマークばかりでよくわからないんです。

あなたは古代の、急いで組み立てたソリューションを使っている。

取引、自動取引システム、取引戦略のテストに関するフォーラム。

ライブラリ: MT4Orders

Aleksey Vyazmikin, 2022.07.21 11:58 AM

私のクラスでエラーとそう仕事を作った

#ifdef __MQL5__
#include <MQL4_To_MQL5.mqh> //https://www.mql5.com/ja/code/16006
#endif // __MQL5__
MT4Ordersとは何の関係もないので、投稿したことを何度も後悔しました。それは例の補足にすぎませんでした。その意味は覚えていません。その意味は覚えていない。


そういえば、ここで「コンバージョン」というもっと凝った解答を作ったことを思い出した。

取引、自動取引システム、取引戦略のテストに関するフォーラム

ライブラリ: MT4Orders

fxsaber, 2019.01.13 17:23 PM.

KimのMT4での機能はかなり人気があるので、私は彼のサイトからすべてのソースをダウンロードし、MT5でそれらのための簡単な「コンバータ」を書きました。
#include <KimIVToMT5.mqh> //https://c.mql5.com/3/263/KimIVToMT5.mqh

私自身はMT4StyleはOrder関数にしか使っていません。他のMT4標準関数は絶対に変換しませんし、このオプションは松葉杖だと考えています。私は、マージン関数を変換しようとせずに、ネイティブ関数にマージン関数を書くことをお勧めします。マージンに関する私のクラスを見ました。そして、これは通常のFXのためだけのものです。

 
fxsaber #:

急いで組み立てた古いソリューションを使っているんだろう。

MT4Ordersとは何の関係もないので、掲載したことを何度も後悔した。単なる例の補足だった。その意味は覚えていない。調べたくもない。


そういえば、ここで「コンバージョン」というもっと凝った解答を作ったことを思い出した。

私自身はMT4StyleをOrder関数にのみ使用している。他のMT4標準関数は絶対に変換しませんし、このオプションは松葉杖だと考えています。私は、マージン関数を変換しようとせずに、ネイティブ関数の上にマージン関数を書くことをお勧めします。マージンに関する私のクラスを見ました。そして、これは通常のFXのためだけのものです。

私は、EAのロジックの機能をMT4とMT5用にコンパイル可能なコードにするというタスクがあっただけで、環境や注文の操作に関するものは、上記のinkludniksの助けを借りて変換したり、別々の関数を取り出してそれぞれのプラットフォーム用に作り直したりしました。このプロジェクトは大規模になり、あなたのソリューションにとても助けられました。

以前、あなたのコードを考慮せずにトラバーサルを行いました(MQL4_To_MQL5.mqhはあなたのコードではありませんか?

#define  MODE_BID 9
#define  MODE_ASK 10
#define  MODE_DIGITS 12
#define MODE_SPREAD 13
#define  MODE_STOPLEVEL 14
#define  MODE_LOTSIZE 15

#define  MODE_POINT 11
#define  MODE_TICKVALUE 16
#define  MODE_TICKSIZE 17

#define  MODE_MAXLOT 18
#define  MODE_MINLOT 19
#define  MODE_LOTSTEP 20

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
double MarketInfo(const string Symb,const int Type)
  {
   switch(Type)
     {
      case MODE_BID:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_BID));
      case MODE_ASK:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_ASK));
      case MODE_DIGITS:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_DIGITS));
      case MODE_SPREAD:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_SPREAD));
      case MODE_STOPLEVEL:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_TRADE_STOPS_LEVEL));
      case MODE_LOTSIZE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_CONTRACT_SIZE));

      case MODE_POINT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_POINT));
       case MODE_TICKVALUE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_TICK_SIZE));
      case MODE_TICKSIZE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_TICK_VALUE));                 
      case MODE_MAXLOT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_MAX));  
      case MODE_MINLOT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_MIN));  
      case MODE_LOTSTEP:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_STEP));                    
     }

   return(-1);
  }
 
Aleksey Vyazmikin #:

それともMQL4_To_MQL5.mqhがあなたのコードではないのですか?

私のコードですが、かなり古いものです。Kimのmqhを調べた方がいい。MarketInfoのためのもっと精巧なソリューションがある。