ATcl - MT4用Tclインタプリタ - ページ 6

 
Maxim Kuznetsov:

ソフトウェア技術の面では、潜在的にはそうです。ライブラリは、クラウド上でない限り、オプティマイザから呼び出すことができます。

NS側では、どのようなことを想定していますか?

オプティマイザではパスを行いデータをファイルに書き込み、ネットワークのトレーニングに渡し、トレーニング後、トレーニングの評価結果をMT4/5に戻し、ネットワーク(ルール)をファイルに書き込む。そしてもう一つは、NSロジックの記録ファイルを使って、(NSバリアントの)最適化を行い、TSの標準指標を修正する場合である。

 

Tkチャートのデモを拡張しました - オーダーのテーブルも表示されるようになりました。

別ウィンドウで表示される受注表

注文のテーブルを参照するMQLコード
- はその注文をすべて選択し、OnOrderListメソッドでtclに送信します。
- 出力には3つのチケットリストがあります - 新規チケット、変更チケット、そして削除チケットです。

void
SendOrderList() 
{
   int total=OrdersTotal();
   Tcl_Obj list=tcl.Ref(tcl.Obj()); // пустой список
   for(int pos=0;pos<total;pos++) {
      if (!OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) ||
         OrderMagicNumber()!=MAGIC ||
         OrderSymbol()!=_Symbol ||
         OrderCloseTime()!=0) continue;
      Tcl_Obj ord=tcl.Ref(tcl.List(
         tcl.Obj(OrderTicket()),
         tcl.Obj(OrderType()),
         tcl.Obj(OrderOpenTime()),
         tcl.Obj(OrderSymbol()),
         tcl.Obj(OrderLots()),
         tcl.Obj(OrderOpenPrice()),
         tcl.Obj(OrderStopLoss()),
         tcl.Obj(OrderTakeProfit()),
         tcl.Obj(OrderComment()),
         tcl.Obj(OrderSwap()),
         tcl.Obj(OrderCommission())
      ));
      tcl.AppendObj(list,ord);
      tcl.Unref(ord);
   }
   if (tcl.Call(panel,methodOnOrderList,list)!=TCL_OK) {
      PrintFormat("OrderSendList failed : %s",tcl.StringResult());
   } else {
      Tcl_Obj triplet=tcl.Ref(tcl.Result()); // 0-новые 1-изменённые 2-удалённые
      Tcl_Obj created=tcl.Ref(tcl.Index(triplet,0));  // список новых ордеров
      Tcl_Obj changed=tcl.Ref(tcl.Index(triplet,1));  // список изменённых ордеров
      Tcl_Obj removed=tcl.Ref(tcl.Index(triplet,2));  // список удалённых ордеров
      PrintOrderList("New orders",created);
      PrintOrderList("Modified orders",changed);
      PrintOrderList("Deleted orders",removed);
      // объекты больше ненужны
      tcl.Unref(removed);
      tcl.Unref(changed);
      tcl.Unref(created);
      tcl.Unref(triplet);
   }
}

と、主な作業を行うTclメソッド :
- 新しい注文のリストを取得する
- よびならす
- は、3つのリスト(新規、変更、削除)をビルドします。
- テーブルを作成します ...これは実際にはツリーで、いくつかのレベルで作成することができます。


# надо обновить внутренние структуры
# и вернуть триплет (список из трёх списков)
#   1 - список новых ордеров
#   2 - ордера которые поменялись
#    3 - ордера которые удалены
method OnOrderList { orderList } {
    set created {}
    set changed {}
    set removed {}
    foreach order $orderList {
        set ticket [ lindex $order 0 ]
        set known($ticket) $order
        if { ! [ info exists Orders($ticket) ] } {
            # новый тикет
            # добавить в список свежесозданных
            lappend created $ticket
            set Orders($ticket) $order
            continue
        }
        if { $Orders($ticket) != $order } {
            # что-то поменялось
            # добавить в список изменённых
            set Orders($ticket) $order
            lappend changed $ticket
        }
    }
    foreach ticket [ array names Orders ] {
        if { ! [ info exists known($ticket) ] } {
            # прежнего ордера нет в новом списке - значит удалён
            lappend removed $ticket
            unset Orders($ticket)
        }
    }
    # обновить грфику :-)
    foreach ticket $removed {
        my OnRemoveOrder $ticket
    }
    foreach ticket $changed {
        my OnChangeOrder $ticket
    }
    foreach ticket $created {
        my OnCreateOrder $ticket
    }
    return [ list $created $changed $removed ]
}

すべてが非常にコンパクトです。
MQLは取引環境に近く、配列でのカウントが早いなど、両言語の長所を生かすことができます。
Tclはリストやハッシュを簡単に扱うことができる。
MQLはタフな取引アルゴリズムを実装し、スクリプトは世界やユーザーとのインタラクションを処理します。

アーカイブを添付します。

ファイル:
atcl.zip  6662 kb
 

見積書をExcelに書き出すスクリプト

見積書を直接Excelにエクスポートする短いスクリプトを作りました。
CSVへの入力やパラメータは一切不要で、チャートに放り込むだけで、Excelシートが開き、すべての相場がそこにコピーされます。

本文をできるだけコメントし、添付しました。スクリプトの詳細は、私のウェブサイトhttp://nektomk.ru/atcl:ratestoexcel に掲載しています。
ボリュームはフォーラムを超えるので、そこそこ。多分、気が向いたらローカルブログに重複して書くと思うので、確実に情報は失われていなかったと思います。

添付のスクリプト

PS/mqhを 一つ変えて、makeを押して、依存関係にあるmq4の束を再構築するような、mqlのバッチコンパイル用のmakeファイルを持って いる方はいらっしゃいますか?

update/ローカルブログに記事を複製https://www.mql5.com/ru/blogs/post/718304- これでおそらく消えないでしょう。
RatesToExcel
  • nektomk.ru
Часто возникающий (и довольно практичный) вопрос у пользователей MetaTrader - «Как скопировать котировки в Excel?» . При помощи библиотеки ATcl это программируется довольно легко. В состав библиотеки входит «большая» программа работающая с Excel, но для частых потребностей сделал короткий скрипт, который делает самую простую вещь - экспорт...
ファイル:
 

メーラーは動くのですが、まだまだ工夫が必要です...。

とりあえず、皆さんに質問ですが、GUI-Builderは需要が あるのでしょうか?
Tkの場合は、あるにはあるのですが、テキストのスクリプトはドローよりも速く書けるので、あまり需要がないのです。

というようなものです.

追記/このようなGUI-Builderの結果は、MT4から起動できるのですが・・・。

 
Maxim Kuznetsov:

メーラーは動くのですが、まだまだ工夫が必要なようです...。


Tk用にはありますが、スクリプトは描画よりもテキストで書く方が速いという事実があるため、あまり需要がありません。

というようなものです.

追記/そんなGUI構築の結果、今では「こんな母ちゃん」の力を借りてMT4から起動できるようになりました...。

なんて面白いんだ...。は、どのように適用するかだけです。

あ、グラフィカルなインターフェースだけに、ディシジョンツリーのような売買ロジックを作るというアイデアがあるんですつまり、グラフィカルなエディタ(つまりシェル)でツリーを作成し、ボタンを使って簡単なルールに変換したり、あるいは直接コードに変換したりするのです!しかし、ルールはコードで非常にコンパクトに読み取ることもできる。

なぜ必要なのか?この手法では、例えば、取引戦略を細かくすることができ、取引するかしないかを決めるだけでなく、この時間に取引するか、この時間に別の方法で取引するかなど、時系列に分けることが容易にできるのです。戦術変更の兆候はいろいろありますが、コードに書くのはあまり便利ではなく、第二に、視覚的に読みにくいので、間違いが多くなります。

あなたの才能を生かす、そんなアイデアに興味はありませんか?

 
Aleksey Vyazmikin:

なんて面白いんだ...。が、それをどう応用するか?

あ、グラフィカルなインターフェースだけに、ディシジョンツリーのような売買ロジックを作るというアイデアがあるんですつまり、グラフィカルなエディタ(つまりシェル)でツリーを作成し、ボタンを使って簡単なルールに変換したり、直接コードに変換したりするのです。しかし、ルールはコードで非常にコンパクトに読み取ることもできる。

なぜ必要なのか?この手法では、例えば、取引戦略を細かくすることができ、取引するかしないかを決めるだけでなく、この時間に取引するか、この時間に別の方法で取引するかなど、時系列に分けることが容易にできるのです。戦術変更の兆候はいろいろありますが、コードに書くのはあまり便利ではなく、第二に、視覚的に読みにくいので、間違いが多くなります。

あなたの才能を生かすためのこのアイデアに興味はありませんか?

グラフィカルな決定木」という考え方がよくわからない。:-) もしかしたら、あなたの才能が足りないのかもしれませんね :-)

 
Maxim Kuznetsov:

グラフィカル・ディシジョン・ツリー」の発想が全くない:-) 多分、あなたには才能がないのでしょう :-)

ルールが設定されたデータテーブルを想像してください。



これらのルールは以下のように構成されています。

      for(int i=1;i<StrokTotal_Buy; i++)
        {
         UslovieSumm_Buy=
                          Sravnenief(arr_Vektor_Week,arrRead_Buy_01[i])+
                          Sravnenief(arr_Vektor_Day,arrRead_Buy_02[i])+
                          Sravnenief(arr_Vektor_Don,arrRead_Buy_03[i])+
                          Sravnenief(arr_DonProc,arrRead_Buy_04[i])+
                          Sravnenief(arr_iDelta_H1,arrRead_Buy_05[i])+
                          Sravnenief(arr_iDelta_H3,arrRead_Buy_06[i])+
                          Sravnenief(arr_iDelta_H4,arrRead_Buy_07[i])+
                          Sravnenief(arr_iDelta_H6,arrRead_Buy_08[i])+
                          Sravnenief(arr_iDelta_H12,arrRead_Buy_09[i])+
                          Sravnenief(arr_iDelta_D1,arrRead_Buy_10[i])+
                          Sravnenief(arr_iDelta_W1,arrRead_Buy_11[i])+
                          Sravnenief(arr_iDelta_MN1,arrRead_Buy_12[i])+
                          Sravnenief(arr_RSI_Open_M1,arrRead_Buy_13[i])+
                          Sravnenief(arr_RSI_Open_H1,arrRead_Buy_14[i])+
                          Sravnenief(arr_BB_Center_Open,arrRead_Buy_15[i])+
                          Sravnenief(arr_BB_Up_Open,arrRead_Buy_16[i])+
                          Sravnenief(arr_BB_Down_Open,arrRead_Buy_17[i])+
                          Sravnenief(arr_TimeH,arrRead_Buy_18[i])+
                          Sravnenief(arr_Den_Nedeli,arrRead_Buy_19[i])+
                          Sravnenief(arr_iDelta_Max_H1,arrRead_Buy_20[i])+
                          Sravnenief(arr_iDelta_Min_H1,arrRead_Buy_21[i])+
                          Sravnenief(arr_iDelta_Max_D1,arrRead_Buy_22[i])+
                          Sravnenief(arr_iDelta_Min_D1,arrRead_Buy_23[i]);                                                                              
;




         if(UslovieSumm_Buy==23)
           {
            Pattern_Buy=1;
            Pravilo_Buy=i;
            break;
           }
        }

ルール値と計算値(指標値/時間/その他のパターン)が一致した場合、例えばトレードアクションが実行されますね。

この取引方法は、非常にコンパクトで汎用性があります。例えば、このような簡単な方法で、多くの戦略をコーディングすることができ、それらに異なるマジックシンボルを与えることができます。

しかし、そのようなプログラミングをするためには、ちょうど良い環境が必要なのです。この環境は決定木(原始的なブロック図)のように見えるはずで、ブロック(例えば、arr_iDelta_Max_D1 の計算結果にあらかじめ定義された値(1,2,3,4 ...n) や、値を制限できるもの、この方法で多くの異なるグループを作成 できます)を作成でき、このブロックから変数の値または変数の値の範囲ごとに分岐し、次のブロックへと続いていくでしょう。こうして、それぞれのルールを決めていくのですが、ちなみに、すべてのブロックを使う必要はないんです。

これで分かってもらえましたか?説明が必要な場合は、お問い合わせください。

 
Aleksey Vyazmikin:

ルールを設定したデータテーブルを提示する



これらのルールは以下のようにコード化されています。

ルール値と計算値(指標値/時間/その他のパターン)が一致した場合、例えば、トレードアクションが実行されるのです。

この取引方法は、非常にコンパクトで汎用性があります。例えば、このような簡単な方法で、多くの戦略をコーディングすることができ、それらに異なるマジックシンボルを与えることができます。

しかし、そのようなプログラミングをするためには、ちょうど良い環境が必要なのです。この環境は決定木(原始的なブロック図)のように見えるはずで、ブロック(例えば、arr_iDelta_Max_D1 の計算結果にあらかじめ定義された値(1,2,3,4 ...n) や、値を制限できるもの、この方法で多くの異なるグループを作成 できます)を作成でき、このブロックから変数の値または変数の値の範囲ごとに分岐し、次のブロックへと続いていくでしょう。こうして、それぞれのルールを決めていくのですが、ちなみに、すべてのブロックを使う必要はないんです。

これで分かってもらえましたか?説明が必要な場合は、お問い合わせください。

シミュレーションのXcos(http://www.scilab.org/en/scilab/features/xcos)と同様の空想のようなもの?
tclで見たことがあります。ブロックを矢印でつなぐ環境...そうやってサウンド/ビデオ/グラフィックス処理をプログラムしていました。http://wiki.tcl.tk/8565 はいろいろあるようで、どこかのブロックにMaximaも突っ込んでいました
もしそうなら、大いに注目したい。
Xcos / Features / Scilab / Home - Scilab
Xcos / Features / Scilab / Home - Scilab
  • Scilab Enterprises
  • www.scilab.org
Xcos is a graphical editor to design hybrid dynamical systems models. Models can be designed, loaded, saved, compiled and simulated.
 
Maxim Kuznetsov:
Xcos (http://www.scilab.org/en/scilab/features/xcos)と同様、シミュレーションでファッショナブルに?
tcl - 環境で、ブロックを矢印でつないでいるのを見たことがあります...それは、サウンド/ビデオ/グラフィックス処理をプログラムする方法です。http://wiki.tcl.tk/8565 はいろいろあるようで、あるブロックにMaximaを突っ込んだりもしていました。
もしそうなら、大いに注目したい。

そうです、この方法です!重要なのは、物事を複雑にせず、正しいインタプリタを作ることで、すべてのブロックが1行(1ブランチ)に集められ、それでMQLのプログラムがすでに動作するようになります。

 
Aleksey Vyazmikin:

そうです、この方法です!主なことは、複雑にしないこと、そして正しいインタプリタを作ることで、すべてのブロックが1行(1ブランチ)に集められ、そのプログラムはすでにMQLで動作するようになります。

Bwiseのコードをいじりたくないなど、複雑にしすぎるのもどうかと思います。

せいぜいATclと併用できるように改造して(Mqlから入力にデータを転送して)出力を取るくらい。
もちろん、「四角を描いてEAに貼り付ける方法」なんてHowToも書かないといけませんが。そして、作者とコミュニケーションをとる際には、英語の練習をしましょう:-)