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

 
Valeriy Yastremskiy #:
Windowsの力を借りて。グラフィックは大きく小さいフォントを設定し、調整する必要があります。

モニターが2台ある場合はどうするのですか?違うもの...

 
Artyom Trishkin #:

モニターが2台ある場合はどうするのですか?違う...

そして、画像を表示する画面の解像度を把握する必要があります。オブジェクトは、2つのモニターに到達することもできます)が、より複雑な作業となります。
はい、負のTextSetFont() 値によってシステムの標準フォントにバインドすることは良い 解決策です。
 

インジケーターの最適化に貢献します。このインジケータは動作が遅いので、EAを最適化するのに非常に時間がかかる。何がいけなかったのか、アドバイスをお願いします。その作業をスピードアップさせるには?

//+------------------------------------------------------------------+
//|                                                     Momentum.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2022, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red

#property indicator_maximum 1
#property indicator_minimum 0

#property indicator_width1 2

//---- input parameters
extern int  MomPeriod    = 10;
extern int  WindowOfNorm = 45; // ширина окна нормирования в барах
extern int  MA_Length    = 10; // Average Period
extern int  MA_Mode      =  0; // Mode of Moving Average

//---- buffers
double NormBuffer[],MomBuffer[],AvgVolumes[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicator line
   SetIndexStyle(2,DRAW_NONE);
   SetIndexBuffer(2,NormBuffer);

   SetIndexStyle(1,DRAW_NONE);
   SetIndexBuffer(1,MomBuffer);
   
    SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,AvgVolumes);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Momentum                                                         |
//+------------------------------------------------------------------+
int start()
  {
   for(int i = 1;i <= 130; i++)
     {
      MomBuffer[i]=iMA(NULL,0,MomPeriod,0,0,0,i)*100/iMA(NULL,0,MomPeriod,0,0,0,i+MomPeriod);

      // нормирование
      NormBuffer[i]=Norm(WindowOfNorm,i);
      //-----
      AvgVolumes[i] = iMAOnArray(NormBuffer,0,MA_Length,0,MA_Mode,i);
     }
   return(0);
  }
//+------------------------------------------------------------------+

// нормирование
double Norm(int norm, int i) {
   // экстремумы
   double max=MomBuffer[ArrayMaximum(MomBuffer,norm,i)];
   double min=MomBuffer[ArrayMinimum(MomBuffer,norm,i)];
   // вычисление осциллятора
   double delta=max-min; // размах
   if(delta==0) return(1);
   else return((MomBuffer[i]-min)/delta);
  }

ファイル:
 
IrishDance #:

インジケーターの最適化に貢献します。このインジケータは動作が遅いので、EAを最適化するのに非常に時間がかかる。何がいけなかった のか、アドバイスをお願いします。どうすれば速く動作させることができるのか?

これはやり方が違う。この行に注目してください

//|                      Copyright © 2004, MetaQuotes Software Corp. |

18年の間にプログラミング言語が大きく変わったので、全く動かないはずはないのですが。なぜMQはまだint init()とint start()を完全に無効化していないのか理解できません。

 

何が問題なのか、テスターで2つのパラメータVLineは、エラー2022.03.24 18:24:27.615を与える TestGenerator: unmatched data error (volume limit 263 at 2022.03.18 14:30 exceeded).

最初のパラメータtime1が削除されれば、すべてうまくいく。

bool FlagOpOr=false;
bool FlagClOr=false;
bool Work=true;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

//---
     static bool FlagNDay=true, FlagVLRed=false,FlagVLBlue=false;
  static datetime Data = 0, NData=0;
  Data = Day();
 if(NData!=Data){FlagVLRed=true; FlagVLBlue=true;NData=Data;} 
if(FlagVLRed==true && Hour()==0){ VLine(1,clrRed); FlagVLRed=false;}
if(FlagVLBlue==true &&  Hour()==1){ VLine(1,clrBlue); FlagVLBlue=false;  }
      
    
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+

void OnDeinit(const int reason)//int deinit(void)void
  {
   int i;
   int obj_total=ObjectsTotal();
   for(i=obj_total-1;i>=0;i--)
     {
 string     sn=ObjectName(i);
      string Head=StringSubstr(sn,0,4);// Извлекаем первые 4 сим
      if(Head == "VLin")
        {
          ObjectDelete(sn);       

       }
     }
   
    Comment("");
   return;
  }
 
  //+------------------------------------------------------------------+
  bool VLine( int time1=0, color clr = clrRed ){
  string  var1=TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
     string NameLine="VLine_" +  "_"+var1;
            bool   created=ObjectCreate(0,NameLine,OBJ_VLINE,0,TimeCurrent(),0);
            if(created)// если создался - сделаем ему тюнинг
              {              
               //--- точка привязки сверху, чтобы не наезжать на бар
               ObjectSetInteger(0,NameLine,OBJPROP_STYLE,STYLE_SOLID);
               //--- последний штрих - покрасим
               ObjectSetInteger(0,NameLine,OBJPROP_COLOR,clr);
               //--- установим толщину линии 
               ObjectSetInteger(0,NameLine,OBJPROP_WIDTH,2); 
                
              }
              else return(false );time1=0;
              return(true);
              }
 

皆さん、こんにちは。取引中は20~40枚のチャートを開いています。すべての楽器の下か、一番上のメニュー項目「ウィンドウ」で、正しいものを探すのにかなりの時間を費やさなければならないのです。スクリプトで加速できれば、入力パラメーターにスクリプトを入れて、必要な記号を入力すれば、目で見つけてクリックしたかのように開いてくれるんです。そのようなことを実現するにはどうしたらいいのか。

 
DanilaMactep #:

皆さん、こんにちは。取引中は20~40枚のチャートを開いています。すべての楽器の下か、一番上のメニュー項目「ウィンドウ」で、正しいものを探すのにかなりの時間を費やさなければならないのです。スクリプトで加速できれば、入力パラメーターにスクリプトを入れて、必要な記号を入力すれば、目で見つけてクリックしたかのように開いてくれるんです。どうすればいいのでしょうか。

ロジックとしては、スクリプトが、今開いているチャートやウィンドウの数と、どのインストルメントかを調べ、それらを記憶し(シンボルとチャートアイディ)、インストルメントの数に応じて、インストルメント名が書かれたボタンのあるパネルを描画することです。ボタンを押すと、必要なインストルメントを持つチャートは、そのプロパティを拡張(折りたたみも可能)、オーバーオールに変更し、スクリプトは閉じます。

 
Valeriy Yastremskiy #:

論理的には、スクリプトは、今開いているチャートやウィンドウの数と、どの計測器かを調べ、それらを記憶し(シンボルとチャートアイディ)、計測器の数に応じて、計測器名が書かれたボタンのあるパネルを描画するはずです。ボタンを押すと、目的の楽器のあるチャートは、そのプロパティを拡張(折りたたみも可能)、オーバーオールに変更し、スクリプトは閉じます。

ロジックが悪い - どのボタンを見るか - 下、メニューウィンドウ、スクリプトで描かれたボタンのどれを見るかの違いか?入力パラメータに目的の記号を入力すると、スクリプトがこのウィンドウを開いてくれるように、何とかしなければなりません - そうすれば、より簡単で速くなります。どなたか、そんな奇跡をお持ちの方、教えてください。
 

こんにちは。

グリッドオペレーターと呼ばれるEAを探しています。

成行注文をグリッドで開く。

グリッドが一定(%)の利益に達したときに注文をクローズします。

そのようなExpert Advisorを見たことがあるのですが、今は見つけることができません。

そのようなExpert Advisorを見たことがあるのですが、今は見つけられません。

 
DanilaMactep #:
悪い論理 - どのボタンを見るか - 下部、メニューウィンドウ、スクリプトによって描かれたボタンのどれを見るかの違いは何でしょうか?何とか入力パラメータに所望のシンボルを入力し、スクリプトはあなたのためにこのウィンドウを開いている、ように行われなければならない - ので、より簡単かつ迅速であろう。どなたか、そんな奇跡をお持ちの方、教えてください。
新しいウィンドウを開く(EAなしで、デフォルトのテンプレートで開く)、または既に開いているウィンドウを上げる、または拡大することができます。
添付のコードを見てください、チャートの列挙と条件によるチャートへの描画があります。もしかしたら、それが役に立つかもしれません。