MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 833

 
Igor Zakharov:

修正されました...でも、なぜか1つだけ残っているんです。



しかもテスターでは再現できない。ただ、同じ日付には持っていません


 

c++からmql4でライブラリに接続できないのですが?以下は、Visual Studio 2012 C++で作成したコードです。ファイルmain.の拡張子をcppにしたもの(main.csr)

#define  MT4_EXPFUNC __declspec(dllexport) создал макрос чтобы не писать запись __declspec(dllexport)int __stdcall add(int a=0, int b=0)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)и так пробовал тоже
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall данная примитивная функция ничего не делает а просто возвращает значение 18
{return (18);пробовал так return 18;}

そして、エクスポートされた関数の リストを持つ、main extension def (main.def)のファイルを作成しました、コードは次のようになります:

LIBRARY "dllmt42"
EXPORTS
add

そして、それをコンパイラにインポートしました。

#import "dllmt42.dll"
int _add(int a=0, int b=0);
#import

コンパイル後は問題ないのですが、EAをチャート上に放置すると、混乱します

未解決のインポート関数呼び出し、'dllmt42.dll' の '_add' が見つかりました。Total Comanderは、ファイルをドラッグすると、コンパイラ本体だけでなく、関数も表示されます

誰が助けてくれるの?

 
Alexandr Sokolov:

修正されました...でも、なぜか1つだけ残っているんです。

しかもテスターでは再現できない。同じ日付でこのエラーは発生しない

このエラーは、以前に修正を行った価格でのポジション/注文を修正しようとしていることを示します...

 

MT5でインジケーターのデータを関数で取得しようとしています。

//************************************************************************************************/
double Envelopes(string symb, ENUM_TIMEFRAMES TF_1, int period, int method, int shift, int price,double Deviation(ENUM_TIMEFRAMES TF_2, int kanal), int buff, int index)
{
  double buf[1];
  int handle=iEnvelopes(Symbol(), TF_1, period, method, shift, price, Deviation(TF_2, kanal), buff);
   if(handle<0)
   {
    Print("Failed to create handle ATR, Error: ",GetLastError());
    return(WRONG_VALUE);
   } else
   {
    if(CopyBuffer(handle,0,index,1,buf)<0)
    {
     Print("Failed to copy data from the indicator ATR, Error: ",GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
}
//************************************************************************************************/

エラーが発生しました。


MT5用のコードを修正する方法を教えてください。

 
Vladimir Pastushak:

このエラーは、すでに修正した価格でポジション/注文を修正しようとしていることを示します...

いや、もう何度も確認しました。問題は、製品のテスト時にMQLの入力パラメータをランダムに選択することにあり、必ずしも互換性があるわけではないのですが、それも修正しました。しかし、現在では、オープンオーダーがないというメッセージが表示されました。


同じペア、同じタイムフレームで持っているものの

 
Alexandr Sokolov:

MQLの入力パラメータがランダムで、互換性がないことが問題だったのですが、それも修正しました。しかし、現在では、オープンオーダーがないというメッセージが表示されました。


しかし、私はそれらを同じペアとタイムフレームで持っています。

なぜ私のEAが取引されないのかわかりません。

 
Vladimir Pastushak:

EAが取引されない原因を探ります。

入力パラメータがランダムに選択され、単にシグナルが発生しない場合は、取引できないことがあります。しかし、それを制限することもいけません

 

トレーディング・フリーズ・ディスタンス」とはどういう意味ですか?を通して受け取りました。

SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL)

MQL4

 

修正時にまたエラー#1が発生しました。このEAでは、SLまたはTPのレベルは、4つのブロックでのみ変更されます。


1ブロック

if(OrderMagicNumber() == id_number && OrderStopLoss() != NormalizeDouble(0,_Digits) && BMod(OrderTicket()) == true)
           {
            if(OrderType() == OP_BUY)
              {
               if(OrderComment() == "1" && Bid - OrderOpenPrice() >= a1 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() + l1,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+l1,_Digits),OrderTakeProfit(),0,clrNONE);};
               if(OrderComment() == "2" && Bid - OrderOpenPrice() >= a2 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() + l2,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+l2,_Digits),OrderTakeProfit(),0,clrNONE);};
              }
            else
              {
               if(OrderComment() == "1" && OrderOpenPrice() - Ask >= a1 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() - l1,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-l1,_Digits),OrderTakeProfit(),0,clrNONE);};
               if(OrderComment() == "2" && OrderOpenPrice() - Ask >= a2 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() - l2,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-l2,_Digits),OrderTakeProfit(),0,clrNONE);};
              };


2ブロック

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && (OrderStopLoss() == NormalizeDouble(0,_Digits) || OrderTakeProfit() == NormalizeDouble(0,_Digits)))
           {
            if(OrderComment() == "1")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
              }
            else if(OrderComment() == "2")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() - sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t2 : OrderOpenPrice() - t2),0,clrNONE);
              };


3ブロック

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && (OrderStopLoss() == NormalizeDouble(0,_Digits) || OrderTakeProfit() == NormalizeDouble(0,_Digits)))
           {
            if(OrderComment() == "1")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
              }
            else if(OrderComment() == "2")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t2 : OrderOpenPrice() - t2),0,clrNONE);
              };


4ブロック

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && OrderTakeProfit() == NormalizeDouble(0,_Digits))
              {
               if(MyOrders() == 1)
                 {
                  bol = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
                 }
               else if(OrderTakeProfit() == 0)
                 {
                  bol = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(OrderType() == OP_BUY ? OrderOpenPrice() + (OrderComment() == "1" ? t1 : t2) : OrderOpenPrice() - (OrderComment() == "1" ? t1 : t2)),0,clrNONE);
                 };


すでに何度も確認しましたが、エラーは見つかりませんでした。

 
Alexandr Sokolov:

修正時にまたエラー#1が発生しました。このEAでは、SLまたはTPのレベルは、4つのブロックでのみ変更されます。



OrderStopLoss() != NormalizeDouble(0,_Digits)


これは、他の例でも正しいものではありません

1.2356にストップを置き、新しいティックで再び1.2356にストップを置くと、エラー1が表示されます。