#include <Graphics\Graphic.mqh>
CGraphic Graphic; // Для вывода графика.long ChartId;
intOnInit()
{
ChartId= ID_Grafika_S_Expertom(); // Узнаем Id графика на котором запущен советник.
Graphic.Create(ChartId,"CPrecieIdealnayFast ", 0, 10, 30, 500, 500);
Print("OnInit ",Symbol()," ChartId=",ChartId);
EventSetMillisecondTimer(1000);
return(INIT_SUCCEEDED);
}
voidOnTimer()
{
string Str;
StringConcatenate(Str,ChartId," ",Symbol()," ",TimeLocal());
Graphic.FontSet("Arial",20);
Graphic.TextAdd(20,30, Str, ColorToARGB(clrRed), TA_LEFT|TA_TOP);
Graphic.Update();
Graphic.Redraw(true);
}
voidOnDeinit( constint Reanson )
{
Graphic.Destroy();
}
long ID_Grafika_S_Expertom()
{
string MaskaNameExpert= MQLInfoString(MQL_PROGRAM_NAME);
int SekyndNaGrafikeSTekygemExpertom= PeriodSeconds();
string SimvolExpert= Symbol();
//--- 1. Настраиваемся на первый график. Если не получилось возращаем советник не найден. //--- В цикле.//--- 2. Получаем Имя эксперта.//--- --- 2.1 Если не удалось получить имя эксперта смотрим следующий график.//--- --- --- 2.2 Если не удалось получить слеюущий график выходим из цикла.//--- 3.A Если на графике есть эксперт И в его названии есть маска: Запоминаем Id и выходим из цикла.//--- 3.B Если Нет эксперта или НЕ нашли смотрим следующий график. //--- --- 3.B.A Если не удалось получить слеюущий график выходим из цикла. //--- --- 3.B.B Если Удалось получить слеюущий график ищем в начало цикла. long ID_Chart= -1;
string NameExpert="";
long IskomoeIdChart= -1;
int LimitChatr= 1000; // Наверняка ведь не 1000 графиков.int i=0; // Cчетчик графиков//--- 1. Настраиваемся на первый график. Если не получилось возращаем советник не найден.
ID_Chart= ChartFirst();
if( ID_Chart < 0 ) return -1;
string Simvol;
int KolichestvoSekynd;
while( i < LimitChatr )
{
//--- 2. Получаем Имя эксперта.
NameExpert= ChartGetString( ID_Chart, CHART_EXPERT_NAME );
Simvol= ChartSymbol(ID_Chart);
KolichestvoSekynd= PeriodSeconds( ChartPeriod(ID_Chart) );
// Print("На графике ",ChartSymbol(ID_Chart)," Period=",ChartPeriod(ID_Chart)," Расположен советник (",NameExpert,")");//--- 3.A Если на графике есть эксперт И в его названии есть маска: Запоминаем Id и выходим из цикла. if( NameExpert != "" &&
StringFind(NameExpert,MaskaNameExpert) > -1 &&
Simvol == SimvolExpert &&
KolichestvoSekynd == SekyndNaGrafikeSTekygemExpertom )
{
// Print("НАШЛИ На графике ",ChartSymbol(ID_Chart)," Period=",ChartPeriod(ID_Chart)," Расположен советник (",NameExpert,")");
IskomoeIdChart= ID_Chart; break;
}
//--- 3.B Если Нет эксперта или НЕ нашли смотрим следующий график. else
{
// Print("Не удалось найти маску (",MaskaNameExpert," в названии эксперта (",NameExpert,") ",ChartSymbol(ID_Chart)," Period=",ChartPeriod(ID_Chart)," ID=",ID_Chart);
ID_Chart= ChartNext(ID_Chart);
i++;
//--- --- 3.B.A Если не удалось получить слеюущий график выходим из цикла. if( ID_Chart < 0 ) {/*Print("Закончились графики.");*/break;}
//--- --- 3.B.B Если Удалось получить слеюущий график ищем в начало цикла. else {/* Print("Получили новое Id графика ",ChartSymbol(ID_Chart)," Period=",ChartPeriod(ID_Chart)," ID=",ID_Chart);*/continue;}
}
}
return IskomoeIdChart;
}
При исследовании и изучении закономерностей важную роль играет визуальное отображение с помощью графиков. В популярных среди научного сообщества языках программирования, таких как R и Python, для визуализации предназначена специальная функция plot. С её помощью можно рисовать линии, точечные распределения и гистограммы для наглядного представления закономерностей. В MQL5 вы можете делать всё то же самое с помощью класса CGraphics.
CGrafic::Destroy() - 動かない!
CGrafic::Destroy() - 動かない!
どのように検出したのですか?どのような症状なのでしょうか?
どのように確認したのですか?どのような症状なのでしょうか?
さて、再生用のコードを添付します :)
そして、Destroy()の後にグラフが追加されているのがわかると思います。
接頭辞付き
_exists
しかし、再生するためのコードは添付されています :)
そして、Destroy()の後にグラフが追加されているのがわかると思います。
接頭辞付き
さて、私の質問は、CGrafic::Destroy() についてでした。デバッガで確認したところ...。コードに何か問題があるのでは?
さて、質問は特にCGrafic::Destroy() についてでした。デバッガで確認したところ...。コードに何か問題があるのでは?
Destroy()プロシージャのボディに入ったからといって、それ(プロシージャ)が正しく動作するわけではありません。
実際に オブジェクトを破壊した後、新しいグラフを追加することはできませんでしたが、追加されました
Destroy()プロシージャのボディに入ったからと言って、それ(プロシージャ)が正しく動作しているとは全く言えません。
実際にオブジェクトが破壊された後は、新しいグラフを追加することができなかったのですが、それができるようになったのです
打撃については、同感です。しかし、それにしても...。さて、まずはvoidCGrafic::Destroy() です。つまり、メソッドは私たちに何の借りもないのです。そして第二に、チェックを加えるのはプログラマー次第かも?すべてのタスクにSBを設定することはできませんが...。
打撃については、同感です。しかし、それにしても...。さて、まずはvoidCGrafic::Destroy() です。つまり、メソッドは私たちに何の借りもないのです。そして第二に、チェックを加えるのはプログラマー次第かも?すべてのタスクにSBを設定することはできません。
さらに、Destroyの方法を変更しました。
そして、やはりチャートが追加されるのです
CGraphicを使って グラフをプロットし、テキストを出力しています。EAのインスタンスを1つ実行すると、すべてうまくいきます。同じEAを異なるチャートで動かすと、常に現在画面上にあるチャートに出力される印象があります。また、Createメソッドで指定されたチャート上ではありません。以下は、この問題を実証するためのEAのコードです。
Expert Advisor 1 が動作すれば、すべて問題ありません。
しかし、2つ目のEAを別のチャートで開くと、最初のチャートは1つ目のEAと2つ目のEAからの情報を同時に受信し始めるのです。
1つのチャートに複数のExpert Advisorが動作しているため、ちらつきが発生することを意味します。ただし、Init関数では、各Expert Advisorは起動したチャートのIdを受け取ります。すると、クリエイトに電話がかかってくるんです。
何が問題なのか理解するのに役立ってください。
CGraphicを使って グラフをプロットし、テキストを出力しています。1つのEAインスタンスが動作している場合は、すべて正常に動作します。同じEAを異なるチャートで動かすと、常に現在画面上にあるチャートに出力される印象があります。また、Createメソッドで指定されたチャート上ではありません。以下は、この問題を実証するためのEAのコードです。
Expert Advisor 1 が動作すれば、すべて問題ありません。
しかし、2つ目のEAを別のチャートで開くと、最初のチャートは1つ目のEAと2つ目のEAからの情報を同時に受信し始めるのです。
1つのチャートに複数のExpert Advisorが動作しているため、ちらつきが発生することを意味します。ただし、Init関数では、各Expert Advisorは起動したチャートのIdを受け取ります。すると、クリエイトに電話がかかってくるんです。
何が問題なのか、ご教示ください。
オブジェクトの名前に、ChartIdを追加する必要はありません?関数内部で追加されているかは覚えていません。