//+------------------------------------------------------------------+//| ButtonClickExpert.mq5 |//| Copyright 2009, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright "2009, MetaQuotes Software Corp."#property link "http://www.mql5.com"#property version "1.00"string buttonID="Button";
string labelID="Info";
int broadcastEventID=5000;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- создадим кнопку, для передачи пользовательских событийObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100);
ObjectSetInteger(0,buttonID,OBJPROP_COLOR,White);
ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,Gray);
ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,100);
ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,200);
ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50);
ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial");
ObjectSetString(0,buttonID,OBJPROP_TEXT,"Кнопка");
ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);
//--- создадим метку для вывода информацииObjectCreate(0,labelID,OBJ_LABEL,0,100,100);
ObjectSetInteger(0,labelID,OBJPROP_COLOR,Red);
ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,50);
ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS");
ObjectSetString(0,labelID,OBJPROP_TEXT,"Нет информации");
ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20);
ObjectSetInteger(0,labelID,OBJPROP_SELECTABLE,0);
//---return(0);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---ObjectDelete(0,buttonID);
ObjectDelete(0,labelID);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
}
//+------------------------------------------------------------------+voidOnChartEvent(constint id,
constlong &lparam,
constdouble &dparam,
conststring &sparam)
{
//--- проверим событие на нажатие кнопки мышкиif(id==CHARTEVENT_OBJECT_CLICK)
{
string clickedChartObject=sparam;
//--- если нажатие на объекте с именем buttonIDif(clickedChartObject==buttonID)
{
//--- состояние кнопки - нажата кнопка или нетbool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE);
//--- выведем в лог отладочное сообщениеPrint("Кнопка нажата =",selected);
int customEventID; // номер пользовательского события для отправкиstring message; // сообщение для отправки в событии//--- если кнопка нажатаif(selected)
{
message="Кнопка нажата";
customEventID=CHARTEVENT_CUSTOM+1;
}
else// кнопка не нажата
{
message="Кнопка отжата";
customEventID=CHARTEVENT_CUSTOM+999;
}
//--- отправим пользовательское событие "своему"графикуEventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message);
//--- отправим сообщение всем открытым графикам
BroadcastEvent(ChartID(),0,"Broadcast Message");
//--- отладочное сообщениеPrint("Отправлено событие с ID =",customEventID);
}
ChartRedraw();// принудительно перерисуем все объекты на графике
}
//--- проверим событие на принадлежность к пользовательским событиямif(id>CHARTEVENT_CUSTOM)
{
if(id==broadcastEventID)
{
Print("Получили широковещательное сообщение от графика с id="+lparam);
}
else
{
//--- прочитаем текстовое сообщение в событииstring info=sparam;
Print("Обрабатывается ПОЛЬЗОВАТЕЛЬСКОЕ событие с ID =",id);
//--- выведем сообщение в меткеObjectSetString(0,labelID,OBJPROP_TEXT,sparam);
ChartRedraw();// принудительно перерисуем все объекты на графике
}
}
}
//+------------------------------------------------------------------+//| послать широковещательное сообщение всем открытм графикам |//+------------------------------------------------------------------+void BroadcastEvent(long lparam,double dparam,string sparam)
{
int eventID=broadcastEventID-CHARTEVENT_CUSTOM;
long currChart=ChartFirst();
int i=0;
while(i<CHARTS_MAX) // у нас наверняка не больше CHARTS_MAX открытых графиков
{
EventChartCustom(currChart,eventID,lparam,dparam,sparam);
currChart=ChartNext(currChart); // на основании предыдущего получим новый графикif(currChart==0) break; // достигли конца списка графиков
i++; // не забудем увеличить счетчик
}
}
//+------------------------------------------------------------------+
とりあえず無視することになると思いますが、MQL4ではコンパイラがそのような指摘を出すことはありませんでした
変数はおそらくOKです。上記の私の投稿をご覧ください...
ユーザー」イベントと、同じ端末で作業する複数の専門家について、開発者に質問します。
正しく作りたいのか、そうでないのか、知りたいのです。
アイデアはこうだ
劇中では、「隣の」専門家に、起こっているいくつかのプロセスを伝える必要があります。
...良いアイデアであれば、改良して記事として正式なものにすることもあります。あるいは、ユーザーイベント専用のヘルプセクションに追加する?
関数EventChartCustomの 例があります。
ぜひお試しください。
もしdoubleをintに変換すれば間違いなく損失が発生しますが、その逆の場合は、関数の2番目の値がint型 なので、正規化の際にエラーが発生する可能性が高いです。
intを doubleに 書き換えた場合、コンパイラは(ルールに従って)端数部分を破棄するだけで、全て正常に処理されます。
しかし、逆の場合、コンパイラは疑い始め、起こりうる問題についての警告を出す(と思われる)。
そして、そのような状況でHAVE TO CREATEをする場合、私たちは皆、その事実を知っているので、彼に「アドバイス」するのです。:)
追記
おそらく開発者は将来的にREAL警告をオフにし、MQL4のように、コンパイラがあらゆる些細なことについて叫ぶのをやめるでしょう...。
ユーザー」イベントと、同じ端末で作業する複数の専門家について、開発者に質問します。
だから、正したいのか正したくないのか、問いたいのです。
ここにアイデアがあります。
再生中に、「隣の」Expert Advisorにいくつかのプロセスを知らせる必要があります。
例えば、以下のようなプロセスを最初に監視する。
1.専門家によるロック
2.Expert Advisorのアンロード。
3.トレーディング業務の終了
4.取引業務を再開する。
実装
I.イベントの4つの識別子を作成します。
1 -CHARTEVENT_CUSTOM+1//Expert Advisor の起動
2 -CHARTEVENT_CUSTOM+2// Expert Advisorのアンローディング
3 - CHARTEVENT_CUSTOM+3 //取引操作の停止
4 -CHARTEVENT_CUSTOM+4//取引業務の再開。
II.イベントのトラッキング
特定の状況が発生すると、Expert Advisorは EventChartCustomを使用してSPARTEVENTメッセージを生成します。
同時に、Expert Advisorは コメント(その名前とイベントの種類、またはその他の情報 )をsparamに書き込み 、lparamは 独自のチャート識別子を 書き込んでいます。
他のチャートのExpert Advisorは、(イベントの性質を正しく認識できれば)この特定のEAに返信します。
追記
アイデアが良ければ、記事として仕上げて形にすることもある。または、カスタムイベント専用のヘルプセクションに追加してください。
EventChartCustom 関数に例があります。
ぜひお試しください。
そう、この例は以前にも見たことがある(何年前かもわからない)。私のアイデアが正しいか、実装が面白いかどうかを聞きたかったのです。
追記
もしヘルプに収まらないのであれば、誰かがそれを改良して、このイベントの応用について記事を書くことに同意してくれるかもしれません。
また、あるEAから別のEA(または他のEA)への注文という形でカスタムイベントを使うのも面白いかもしれませんね。
残念ながら、対応する時間がないのですが...。
また、特に複数のシンボルをプレイする場合、一度に複数のEAを使用する意味がわからない - あなたは簡単に1つのEAで行うことができ、修正、開閉はまた、指標の分析、あまりにも、1つのEAで行うことができます。
特に、すべてのEAがアプリオリに多通貨であるとは限らないので、必ず感覚があります(MQL4での経験から)。
つまり、初心者や、かつて機械的な取引に従事していた人の多くが、多通貨のものをきちんと整理するのは簡単ではないのです...。
誰かが、例えば、1つのアカウントでMACDサンプルの コピーを2-3個実行したい場合、何が起こるかは神のみぞ知る、です。
状況が異なれば、他のExpert Advisorは最初のExpert Advisorから注文を受ける二次的な役割を果たすかもしれません。
また、他のEA(「neighbor」)が取引を 行わず、データ処理や特定の作業のみを行う場合にも、このバリアントが許容されます。
また、インデックスとEAとのコミュニケーションにおいても、同様のことが(一定のアプローチで)実現可能である。
追記
そこで、この問題に取り組み、経験豊富なプロゲーマーが記事を書いてくれるならと提案したわけです。特に、開発者自身がこの問題に時間を割いてくれると嬉しいですね。
1記事分以上のネタがあると思うのですが...。
残念ながら時間がないのですが...。
vMAとClose[]を見ています。ヲタッフでは、細かくカウントしています。また、こんな風に試してみました。
またもや、別のエラーが発生しました。単純移動平均の計算方法は他にもあるのかもしれませんね。 それともハンドルiMAをとって、あるべきところに CopyBuffer ?
1.ウォッチャーでは、Close配列の名前(一般的な情報しか表示されない)か、Close[1], Close[2],..., Close[i] の特定の値を指定する必要があります。
2.このコードでは、mrate 配列をどのように埋めているかがわかりません。
3.標準ライブラリの MovingAverages.mqhを見てください - MA計算の例があります。
私たちは理解しています。誰彼構わずコメントすることに時間を費やしすぎ...。
コメントも、あるアイデアを実行するための時間も十分にあります。
ただ、この分野全体をカバーするほど真剣に取り組むことはないだろうということです(純粋に自分自身のために、すでにこのアイデアの応用のいくつかを扱っています)。
しかし、いずれにしても私はこのテーマで記事を書くことはおそらくないでしょう(諸事情により)...。