О!驚いたことに、文字通り数分で問題が見つかり、修正されたのです。確かに、問題は取引履歴にあり、1ティック ごとにオーバーしていた。当初使用していた「the simplest Expert Advisor for mql5」のコードから継承した関数です。それ以来、いつの間にか忘れ去られていたのです。効いているようなので、わざわざ...と思ってしまいます。明らかに、そのコードの残骸に目を通した方が良いですね :)念のため、同じようなラグでここをググった人がいたら、問題の断片と、この問題を解決しようとした私の創作を掲載します。私のバージョンは、ソースとの関係でどれだけ「正しい」のかはわかりません。おそらく、私が書く他のものとまったく同じクソみたいなコードでしょう。[私はもちろん、気にしない。つまり、もし誰かが下の部分を使おうと思ったら、作者が独学のクソコテであることを考慮に入れてください。しかし、少なくとも、何も壊れていないようですし、ロボットはジェット機のように飛んでいます。)まあ、少なくとも以前と比べれば。トライアル2ヶ月が1分程度で終わったのは、やはり本家の6時間以上とは対照的でいい感じです %)
でした。
// Эта функция вызывалась дважды за каждый тик. С ее помощью записывались две глобальные переменные: // с ценой последнего ордера и числом открытых ордеров (да, взятый за исходник код был примером самого простейшего мартина). double History(bool LastPrice = false){
long Ticket, OldTicket = 0, PosID, Magic, Dir;
double PriceOpen = 0, Count = 0;
ENUM_DEAL_TYPE CheckDir;
if(Sell) CheckDir = DEAL_TYPE_SELL;
elseif(Buy) CheckDir = DEAL_TYPE_BUY;
HistorySelect(0, Now);
int HistoryTotal = HistoryDealsTotal();
// Проблемное место было тут: в цикле перебиралась вся история торговли, что в начале немного. // Но даже за сутки счетчик доходил до сотни (не рискну предположить, сколько там набиралось за месяц). // И этот бессмысленный и беспощадный процесс повторялся на каждом тике вообще без всякой на то причины.for (int i=0; i < HistoryTotal; i++){
Ticket = (int)HistoryDealGetTicket(i);
PosID = HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);
Magic = HistoryDealGetInteger(Ticket, DEAL_MAGIC);
Dir = HistoryDealGetInteger(Ticket, DEAL_TYPE);
if(LastPrice) { // Этой частью добывалась ценаif(PosID == PositionID && Magic == MagicNumber && Dir == CheckDir) {
if(Ticket > OldTicket) {
PriceOpen = HistoryDealGetDouble(Ticket, DEAL_PRICE);
OldTicket = Ticket;
}
}
}
else { // А тут оно считало ордераif(PosID == PositionID && Magic == MagicNumber) Count++;
}
}
if(LastPrice) return(PriceOpen);
elsereturn(Count);
}
なった。
// Вызывается она теперь только в конце функций создания/изменения/закрытия позиций. Если открытых нет - глобальные переменные просто обнуляются.// Хотя в принципе, если вызывать ее не каждый тик, а только на изменениях, вероятно и старая версия не тормозила бы так уж сильноvoid History(){
long Ticket, PosID, Magic, Dir;
bool GotPrice = false;
Total = 0;
HistorySelect(0, Now);
int HistoryTotal = HistoryDealsTotal();
// Похоже, что быстрее будет считать с обратного концаfor(int i=HistoryTotal;i>=0;i--){
Ticket = (int)HistoryDealGetTicket(i);
PosID = HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);
Magic = HistoryDealGetInteger(Ticket, DEAL_MAGIC);
Dir = HistoryDealGetInteger(Ticket, DEAL_TYPE);
if(PosID == PositionID && Magic == MagicNumber) {
// Корявую конструкцию заменяем на... другую корявую конструкцию... но она хотя бы компактнее :)
Total++;
if(!GotPrice){
LastOrderPrice = HistoryDealGetDouble(Ticket, DEAL_PRICE);
GotPrice = true; // Раз уж нужная цена всегда в начале списка, на ней и остановимся
}
}
// Чтобы не перепахивать всю торговую историю, если номер позиции уже меньше нашего (но больше ноля) - прерываем циклelseif(PosID > 0 && PosID < PositionID) break;
}
}
そして、「歴史に基づいたかなりの計算」がダイナミックな配列に 加算されるのですね。
そんなのあるんですね、はい :)正確には、複数の動的配列が使われるのですが、あまり大きなサイズにならないようにするためです。
また、半分に分割することについてですが、どちらのセグメントを取るか、いくつのインプットを持つかは、あまり違いがないように思います。平均して1日は2500〜3500msで処理されるが、1週間は数分待つ必要がある。今、手元に適当なログがないので、どの程度かわからない。しかし、1日5倍という桁違いの量で、しかもそのほとんどが最後の1〜2日に費やされている。一方、1ヶ月は一晩置いても、朝にはおそらくまだぶら下がっているはずです>.>。
また、半分に分割することについてですが、どのセクションを取るか、何回入力するかはあまり変わらないようです。
どこかに「EAが不調になる最も多い理由」みたいな記事ないかなぁ?Strategy TesterのExpert Advisorが、最初は飛んでいるのに、だんだん遅くなるのはなぜですか?致命的というほどの開発段階ではない(基本的な機構や道具の開発には十分な速度がある)。しかし、1週間以上の区間は意味がなく、それ以降はすでに速度がゼロになる傾向があるので、やはり不便です。
その車輪に塗料の入った樽を載せて、必要に応じて後ろに滑らせてみてください。
https://www.mql5.com/ru/forum/14041/page3#comment_605412
ペイントバレルにキャスターをつけ、必要に応じて後ろにスライドさせてみてください。
https://www.mql5.com/ru/forum/14041/page3#comment_605412
楽しいたとえ話です :)ご指摘ありがとうございます。あとは樽を探すだけ...。というか、樽ですね。しかし、すでにニュースや抵抗レベルのハンドラーを漠然と疑っているのですが...。
多くの場合、そのようなバレルは「時間の始まり」であり、エキスパートアドバイザーがバー(ティック)ごとに再分析しようとする自身の取引履歴(または他の蓄積された情報)です。
О!驚いたことに、文字通り数分で問題が見つかり、修正されたのです。確かに、問題は取引履歴にあり、1ティック ごとにオーバーしていた。当初使用していた「the simplest Expert Advisor for mql5」のコードから継承した関数です。それ以来、いつの間にか忘れ去られていたのです。効いているようなので、わざわざ...と思ってしまいます。明らかに、そのコードの残骸に目を通した方が良いですね :)念のため、同じようなラグでここをググった人がいたら、問題の断片と、この問題を解決しようとした私の創作を掲載します。私のバージョンは、ソースとの関係でどれだけ「正しい」のかはわかりません。おそらく、私が書く他のものとまったく同じクソみたいなコードでしょう。[私はもちろん、気にしない。つまり、もし誰かが下の部分を使おうと思ったら、作者が独学のクソコテであることを考慮に入れてください。しかし、少なくとも、何も壊れていないようですし、ロボットはジェット機のように飛んでいます。)まあ、少なくとも以前と比べれば。トライアル2ヶ月が1分程度で終わったのは、やはり本家の6時間以上とは対照的でいい感じです %)
でした。
なった。
とにかく、ありがとうございました :)このヒントがなければ、おそらくまだ長い間、コードの遠いほこりだらけの隅を調べることを思いつかなかったでしょう...。
О!驚いたことに、文字通り数分で問題が見つかり、修正されたのです。確かに、問題は取引履歴にあり、1ティックごとにオーバーしていた。当初使用していた「the simplest Expert Advisor for mql5」のコードから継承した関数です。それ以来、いつの間にか忘れ去られていたのです。効いているようなので、わざわざ...と思ってしまいます。明らかに、そのコードの残骸に目を通した方が良いですね :)念のため、同じようなラグでここをググった人がいたら、問題の断片と、この問題を解決しようとした私の創作を掲載します。私のバージョンは、ソースとの関係でどれだけ「正しい」のかはわかりません。おそらく、私が書く他のものとまったく同じクソみたいなコードでしょう。[私はもちろん、気にしない。つまり、もし誰かが下の部分を使おうと思ったら、作者が独学のクソコテであることを考慮に入れてください。しかし、少なくとも、何も壊れていないようですし、ロボットはジェット機のように飛んでいます。)まあ、少なくとも以前と比べれば。トライアル2ヶ月が1分程度で終わったのは、やはり本家の6時間以上とは対照的でいい感じです %)
でした。
なった。
とにかく、ありがとうございました :)このヒントがなければ、おそらくまだ長い間、コードの遠いほこりだらけの隅を調べることを思いつかなかったでしょう...。
最近、パネル作成に再注目しているので、質問です。OBJ_RECTANGLE_LABELと OBJ_LABELの 2つのラベルを作成していますが、OBJ_RECTANGLE_LABELをグラフィック上にドラッグして、OBJ_LABELを正確に1つとしてドラッグできる方法が分かりません。もしかしたら、お互いに束縛しあって、片方にアクションを起こすと、もう片方(他全部)にも同じアクションを起こすような仕組みになっているのでは?
そのような仕組みはないので、自分で作るしかない。 幸い、それほど難しいことではないのだが。でも、ちょっと手間がかかりますね。
頑張ってください。