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

 
Anatoliy Ryzhakov:
こんにちは。履歴の中の最後尾の注文の 型値を返す方法を教えてください。

最後に閉じた注文の時刻を見つけて、最大閉時刻で、最後に記憶した時刻より小さい注文を検索する必要があります、これは私がやったことです。

https://www.mql5.com/ru/forum/247136#comment_7555643

私の例ではチケットが検索されたので、チケットの代わりに注文のタイプを返す必要があります。

История ордеров
История ордеров
  • 2018.05.24
  • www.mql5.com
Всем привет! Столкнулся с проблемой... сделал робота, который читает историю и открывает сделку...
 

c++からmql4にエクスポートする関数に テンプレートを適用することは可能でしょうか?

拡張子が "srp "の通常型のファイルを作り、そこにプリミティブな関数を書きました。

#define  MT4_EXPFUNC extern "C++" __declspec(dllexport)
MT4_EXPFUNC  int __stdcall  add(int a=0, int b=0)//stdcall //cdecl
{return (18);}

そして、拡張子が「def」のファイルを作成し、エクスポートする関数名を指定しました。

LIBRARY "dllmt42"
EXPORTS
add

そして、Build - Build Solutionで実行しました。
これから配列を扱う関数を開発するので、テンプレートを適用したいのですが、テンプレートがないとどうにもなりません。

#define  MT4_EXPFUNC extern "C++" __declspec(dllexport)
template<typename T>MT4_EXPFUNC  int __stdcall  add(T a=0, T b=0){ return (18);}

Tは強調表示されていますが、エラーヘルプアドバイスがあることを書き込み、それが可能である、再配置しようとしましたか?また、このような関数はmql4側からどのように呼び出されるのでしょうか?




 
Roman Shiredchenko:

コードベースを見る - MT4では間違いなくそうでした。

トップページのこのスレッドにね。

 

こんばんは。MT5の勉強と学習の過程で、一般的に困難ではないタスクを実装しようとするが、少し経験と知識のギャップ......一般的に動作しませんが、ヘルプと支援をお願いします。

私はインジケーターとエキスパートアドバイザーを持っていますが、どちらもオープンソースのコードで、同じ作者(Artem Trishkin、尊敬と称賛)によるものです。インジケータに尋ねる時に実際の方向を取得するようにしています。インジケーターは、この方向を上下の矢印で表示します。得られた方向は、Expert Advisorがシグナルとして、またはフィルターとして使用されますが、まだ遠いです。

インジケーターのハンドルは手に入れたのですが、インジケーターからの矢印のデータ値がぐちゃぐちゃで、わかりません。

インジケータは変更していません。 Expert AdvisorにOnInitを追加しています。

   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
   if (CrossAD == INVALID_HANDLE)
   {
      Print("Не удалось создать описатель индикатора iCrossAD!");
      return(INIT_FAILED);
   }
      else Print("Хендл iCrossAD = ",CrossAD);

OnTickを追加しました。

   int n=0;
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Buy_index  = n;
         Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find || ArraySize(Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 3-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Sell_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Sell_index  = n;
         Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);

もちろん、適切なオーバーペン、アレイ、タイムスリールやtdとして定義されたものを記述し、起動したのですが......。

コメントと プリントを使用して確認しました。すぐにではありませんが、エラーはなく、警告が数回出るだけで、よくわかりません。しかし、肝心なのは、パラメータの定義が正しくないということです。以下の条件にもかかわらず、上向き矢印の場合は最大2倍、下向き矢印の場合はいくつかの負の数が出力されます。

if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
и
if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
 
以下はそのファイルです。
ファイル:
 
Sergey Voytsekhovsky:
以下はそのファイルです。

テストに不要な機能がたくさんある記事からパクるのではなく、簡単なテスト用EAでインジケータからのデータ取得をテストすることから始めるといいでしょうね。

MQL Wizardで簡単なExpert Advisorを作成し、それを使ってiCustom()を使った 練習をするだけです。

 
Sergey Voytsekhovsky:

こんばんは。MT5の勉強と学習の過程で、一般的に困難ではないタスクを実装しようとするが、少し経験と知識のギャップ......一般的に動作しませんが、ヘルプと支援をお願いします。

私はインジケーターとエキスパートアドバイザーを持っていますが、どちらもオープンソースのコードで、同じ作者(Artem Trishkin、尊敬と賞賛)によるものです。インジケータに尋ねる時に実際の方向を取得するようにしています。インジケーターは、この方向を上下の矢印で表示します。得られた方向は、Expert Advisorがシグナルとして、またはフィルターとして使用されますが、まだ遠いです。

インジケーターのハンドルは手に入れたのですが、インジケーターからの矢印のデータ値がぐちゃぐちゃで、わかりません。

インジケータは変更していません。 Expert AdvisorにOnInitを追加しています。

OnTickを追加しました。

もちろん、適切なオーバーペン、アレイ、タイムスリールやtdとして定義されたものを記述し、起動しました......。

コメントと プリントを使用して確認しました。すぐにではありませんが、エラーはなく、警告が数回出るだけで、よくわかりません。しかし、肝心なのは、パラメータの定義が正しくないということです。以下の条件にもかかわらず、上向き矢印の場合は2倍の最大数、下向き矢印の場合はいくつかの負の数が印刷されます。

Artyomは正しく、私は1つの比較の無駄を指摘します。

if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)

CopyBuffer が配列にコピーされた要素数を返す場合、配列のサイズはまさにその通りになります。したがって、強調表示された部分は、最初の条件と単純に重複していることになります。

あと、思いつきですが、インジケーターやEAのコードを見てないので、間違っているかもしれません。period_findの範囲に信号があるはずですが、本当にそうでしょうか?

 
Alexey Viktorov:

アルチョムは正しく、一つの比較の不必要さを指摘する

CopyBuffer が配列にコピーされた要素数を返す場合、配列のサイズはまさにその通りになります。これに対応して、選択された部分の条件は、最初の条件を単純に複製したものになります。

思いつきです:インジケーターやExpert Advisorのコードを確認していないので、間違っているかもしれません。period_findの範囲に信号があるはずですが、本当にそうでしょうか?

そうですね。フィルターのようなもので、信号の周波数はこれに依存します。

 
Artyom Trishkin:

テストに不要な関数がたくさんある記事からパクるのではなく、簡単なテスト用EAでインジケータからデータを取得するテストから始めるといいでしょう。

iCustom() 関数を使用するとより便利です。

ありがとうございます、良いアドバイスですね、そうしてみます、少なくとも便利になりますね。

今日から始めます。
 

ロットの配給のどこが悪いのか、教えてください。

double lot_=0.01;
double minlot=0.10;
double LotNormalize(double lot_)
  {
   if(minlot==0.001)
     {
      return(NormalizeDouble(lot_,3));
     }
   if(minlot==0.01)
     {
      return(NormalizeDouble(lot_,2));
     }
   if(minlot==0.10)
     {
      return(NormalizeDouble(lot_,1));
     }

   return(NormalizeDouble(lot_,0));
  }