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

 
Alexey Viktorov:

良いアドバイスのために、最初から読み始めることをお勧めします。最初の質問があったところから、その後の議論まで。

 
Kamilzhan:

完全な答えを出すには、4回ではなく、1回で十分です。


MT4のすべてのカラー・インジケータは、現在の値が前のバーの値より大きい場合、バッファの1つが満たされるように構成されています。現在の値が前のバーの値より低い場合、別のバッファが満たされます。また、ライン、ヒストグラム、アスタリスク/ドットなど、表示の種類は問わない...。

 

完全に動作するEAがあり、チャートの2つのスクリーンショットをテレグラムに送信します。最初のスクリーンショットはターミナルで開いたウィンドウから、2番目は同じツールからですが異なるタイムフレームで送信します。

新しいウィンドウを開き、テンプレートを適用 してスクリーンショットを撮り、ウィンドウを削除します。しかし、2枚目のスクリーンショットを使ったこの方式は、常に安定しているわけではありません。

新しいウィンドウを開かないで、ずっと同じように使いたいのですが、目的のツールに置き換えて、コードで微調整するのを手伝ってください。


//+------------------------------------------------------------------+
//|                                                          777.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#include <Telegram.mqh>
string Token="7417:AAH54X9HyFIbecqq1U1-R18tU";
int ChannelID=33722;
CCustomBot bot;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
struct TSignalInfo
  {
   string            symbol;
   ENUM_TIMEFRAMES   timeframe;
   datetime          time_last;
   //---   
   static datetime GetMinute()
     {
      MqlDateTime dt;
      TimeCurrent(dt);
      dt.sec=0;
      return(StructToTime(dt));
     }
  };
TSignalInfo signal[];
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
bool SignalIsAllowed(const string _symbol,
                     const ENUM_TIMEFRAMES _timeframe)
  {
//--- find
   int total=ArraySize(signal);
   for(int i=0;i<total;i++)
     {
      if(signal[i].symbol==_symbol && 
         signal[i].timeframe==_timeframe)
        {
         //Print("found");
         if(signal[i].time_last<TSignalInfo::GetMinute())
           {
            signal[i].time_last=TSignalInfo::GetMinute();
            return(true);
           }
         
         return(false);
        }
     }

//--- add
   ArrayResize(signal,total+1);
   signal[total].symbol=_symbol;
   signal[total].timeframe = _timeframe;
   signal[total].time_last = TSignalInfo::GetMinute();
   //Print("add");
   return(true);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bot.Token(Token);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   if(id==CHARTEVENT_CUSTOM+234)
     {
      if(!SignalIsAllowed(ChartSymbol(lparam),ChartPeriod(lparam)))
         return;
      //Print("Custom: ",lparam," ",dparam," ",sparam);   
      ChartScreenShot(lparam,"chart.gif");

      //--- первый скриншот
      string _photo_id;
      int err=bot.SendPhoto(_photo_id,ChannelID,"chart.gif",sparam);
      ChartSetSymbolPeriod(lparam,ChartSymbol(lparam),ChartPeriod(lparam));

      if(ChartPeriod(lparam)!=PERIOD_H4)
        {
         string _symbol=ChartSymbol(lparam);
         ChartScreenShot(_symbol,PERIOD_H4,"chart.gif","BollingerBands");
         string _photo_id2;
         int err2=bot.SendPhoto(_photo_id2,ChannelID,"chart.gif",sparam);
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ChartScreenShot(long chart_id,const string file_name)
  {
//--- создать скриншот
   const int chart_width=1280;
   const int chart_height=623;

   FileDelete(file_name);
//---
   if(ChartScreenShot(chart_id,file_name,chart_width,chart_height,ALIGN_RIGHT))
     {
      //---
      ChartRedraw(chart_id);
      Sleep(500);
      //--- waitng 30 sec for save screenshot
      int wait=30;
      while(!FileIsExist(file_name) && --wait>0)
        {
         printf("Waiting %d sec ...",wait);
         Sleep(1000);
         ChartRedraw(chart_id);
        }

      //--- check file
      if(!FileIsExist(file_name))
         printf("Failed to create a screenshot '%s'.",file_name);
     }
   else
     {
      Print("ChartScreenShot error ",_LastError);
      return(false);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ChartScreenShot(const string _symbol,
                     const ENUM_TIMEFRAMES _tf,
                     const string file_name,
                     const string _template)
  {

//---
   long chart_id=ChartOpen(_symbol,_tf);
   ChartRedraw(chart_id);
   Sleep(155);
//---     
   if(StringLen(_template)>0)
      if(!ChartApplyTemplate(chart_id,_template))
         Print("Apply Template error: ",_LastError);

//--- создать скриншот
   const int chart_width=1280;
   const int chart_height=623;

   FileDelete(file_name);
//---
   if(ChartScreenShot(chart_id,file_name,chart_width,chart_height,ALIGN_RIGHT))
     {
      //---
      ChartRedraw(chart_id);
      Sleep(500);

      //--- waitng 30 sec for save screenshot
      int wait=30;
      while(!FileIsExist(file_name) && --wait>0)
        {
         printf("Waiting %d sec ...",wait);
         Sleep(1000);
         ChartRedraw(chart_id);
        }

      //--- check file
      if(!FileIsExist(file_name))
         printf("Failed to create a screenshot '%s'.",file_name);
     }
   else
     {
      Print("ChartScreenShot error ",_LastError);
      ChartClose(chart_id);
      return(false);
     }

   ChartClose(chart_id);
   return(true);
  }
//+------------------------------------------------------------------+ 
 
Alexey Viktorov:

mql4では、現在の値が前の値より高ければ、緑色でバッファが異なり、その逆であれば、...。逆もまた然り)))

ありがとうございます、すべて納得です。

 

皆さん、ごきげんよう。私は50種類の商品を取引しています。私はレベルトレードをしています。50枚のチャートを開いてターミナルを読み込まないように、プロファイルを使った作業を設定しています。私がすべてのシンボルに手で描いたレベルを使用して、「ユーロドルを見てください、何か面白いものが形成されています」というようなシグナルを画面に表示するアシスタントを書きたいのです。 私は、すべてのシンボルのすべてのレベルがコピーされ、ロボットが多通貨になるように、DLLを書くべきであると思います。

このタスクをどのように実装するか、誰か考えている人はいますか?

dllのプロファイルからデータを引き出すには?

PS.ツールフォルダを見ると、拡張子が "chr "のファイルがあります。メモ帳を開くと、必要な情報がすべて表示されました。こんな使い方はどうでしょう?

 
こんにちは、私は初心者でプログラミングが得意ではありません。MT5用のパラボリック SARインジケータを ドットではなく線で表示させたいのですが、どうしたらよいでしょうか?よろしくお願いします。
 
valeriikopp:
こんにちは、私は初心者でプログラミングが得意ではありません。MT5用のパラボリックSARインジケータをドットではなく線で表示させたいのですが、どうしたらよいでしょうか?よろしくお願いします。

+

ファイル:
 

こんにちは、私は高値が増加する一連の4つのバーの後にチャート全体に垂直線を 描画するスクリプトを作成しようとしています。スクリプトは最初に一本だけ描いて終わりです。エラーは何ですか?訂正のご協力をお願いします。

void OnStart()
 {
double bbup0,
       bbup1,
       bbup2,
       bbup3;
       int a=0;
for(;a<Bars;a++)
{
bbup0=High[a];
bbup1=High[a+1];
bbup2=High[a+2];
bbup3=High[a+3];

if((bbup0<bbup1)&&(bbup1<bbup2)&&(bbup2<bbup3)) 
ObjectCreate(0,"Line",OBJ_VLINE,0,Time[a],0);
 } 
}
 
pvba:

こんにちは、私は高値が増加する一連の4つのバーの後にチャート全体に垂直線を 描画するスクリプトを作成しようとしています。スクリプトは最初に一本だけ描いて終わりです。エラーは何ですか?訂正のご協力をお願いします。

名前は各行ごとにオリジナルである必要があります

を1つの名前にしているんですね。

を選択すると、その作成時刻を名前に追加することができます。

 
Iurii Tokman:

名前は各行ごとにオリジナルである必要があります

ひとくくりにして

名前に作成時刻を加えることができます。

ありがとうございました。