ATcl - Tcl-Interpreter für MT4 - Seite 6

 
Maxim Kuznetsov:

Was die Softwaretechnologie betrifft, möglicherweise ja. Bibliotheken können vom Optimierer aufgerufen werden, solange sie sich nicht in der Cloud befinden.

auf der NS-Seite - wie stellen Sie sich das vor?

Im Optimierer wird ein Durchlauf gemacht und die Daten werden in die Datei geschrieben, dann werden sie an das Netztraining weitergegeben, nach dem Training werden die Ergebnisse der Trainingsauswertung an MT4/5 zurückgegeben und das Netz (Regeln) wird in die Datei geschrieben. Die andere Sichtweise ist, dass wir die aufgezeichneten Dateien der NS-Logik verwenden, um Optimierungen (der NS-Varianten) durchzuführen und Standardindikatoren von TS zu beheben.

 

Ich habe die Tk-Chart-Demo erweitert - sie zeigt jetzt auch die Tabelle der Aufträge an.

Auftragstabelle in einem separaten Fenster

Der MQL-Code, der sich auf die Tabelle der Aufträge bezieht
- wählt alle seine Aufträge aus und sendet sie in der Methode OnOrderList an tcl
- In der Ausgabe erhalten wir 3 Ticketlisten - die neuen, die geänderten und die gelöschten

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);
   }
}

und die Tcl-Methode, die die Hauptarbeit leistet:
- erhält eine neue Liste von Aufträgen
- mit früheren Aufrufen vergleichen
- erstellt 3 Listen (neu, geändert, gelöscht).
- Es wird eine Tabelle erstellt, die eigentlich ein Baum ist und in mehreren Ebenen erstellt werden kann.


# надо обновить внутренние структуры
# и вернуть триплет (список из трёх списков)
#   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 ]
}

alles ist sehr kompakt.
Sie können die Stärken beider Sprachen nutzen - MQL ist nah an der Handelsumgebung und zählt schnell in Arrays,
Tcl kann problemlos mit Listen und Hashes umgehen.
MQL implementiert einen robusten Handelsalgorithmus, während Skripte die Interaktion mit der Welt und dem Benutzer übernehmen.

Das Archiv ist beigefügt.

Dateien:
atcl.zip  6662 kb
 

Ein Skript zum Exportieren von Angeboten nach Excel

Ich habe ein kurzes Skript erstellt, um Angebote direkt nach Excel zu exportieren.
Ohne Eingaben in CSV oder irgendwelche Parameter - einfach auf das Diagramm werfen, das Excel-Blatt wird geöffnet und alle Kurse werden hineinkopiert.

Ich habe den Text so weit wie möglich kommentiert und beigefügt. Ich habe die Einzelheiten des Skripts auf meiner Website http://nektomk.ru/atcl:ratestoexcel bereitgestellt .
Die Lautstärke geht über das Forum hinaus, also da. Wenn ich in der Stimmung bin, werde ich es vielleicht im lokalen Blog vervielfältigen, damit die Informationen nicht verloren gehen.

Das beigefügte Skript

PS/ Hat jemand eine make - Datei für die Batch-Kompilierung von mql ? das wird eine mqh ändern, schieben Sie Make und bauen Sie eine Reihe von mq4, die in Abhängigkeiten aufgeführt sind...

aktualisieren/ duplizieren Sie den Artikel im lokalen Blog https://www.mql5.com/ru/blogs/post/718304 - jetzt wird er wahrscheinlich nicht mehr verschwinden
RatesToExcel
  • nektomk.ru
Часто возникающий (и довольно практичный) вопрос у пользователей MetaTrader - «Как скопировать котировки в Excel?» . При помощи библиотеки ATcl это программируется довольно легко. В состав библиотеки входит «большая» программа работающая с Excel, но для частых потребностей сделал короткий скрипт, который делает самую простую вещь - экспорт...
Dateien:
 

Der Mailer funktioniert, aber es muss noch mehr getan werden...

In der Zwischenzeit eine Frage an die Leute - wird der GUI-Builder nachgefragt werden?
für Tk gibt es sie, aber aufgrund der Tatsache, dass Skripte in Text schneller geschrieben werden als in Draw, sind sie wenig gefragt.

etwa so:

PS/ das Ergebnis eines solchen GUI-Builders kann von MT4 aus gestartet werden...

 
Maxim Kuznetsov:

der Mailer funktioniert, aber es muss noch mehr getan werden...

aber in der Zwischenzeit eine Frage an die Leute - wird es eine Nachfrage nach GUI-Buildern geben?
für Tk gibt es sie, aber aufgrund der Tatsache, dass Skripte schneller in Text als in Zeichnung zu schreiben sind, sind sie nicht sehr gefragt.

etwa so:

PS/ Das Ergebnis eines solchen GUI-Builders und jetzt mit Hilfe von "so und so einer Mutter" kann von MT4 aus ausgeführt werden...

Was für ein interessantes Zeug... nur wie man sie anwendet?

Ah, ich habe eine Idee für grafische Schnittstellen - Handelslogik wie einen Entscheidungsbaum erstellen! Das heißt, Sie erstellen einen Baum im grafischen Editor (d.h. Shell) und wandeln ihn über eine Schaltfläche in einfache Regeln oder sogar direkt in Code um! Regeln können aber auch sehr kompakt im Code gelesen werden.

Warum brauchen wir sie? Mit diesem Ansatz lässt sich die Handelsstrategie detailliert beschreiben, z. B. können wir sie leicht in Zeitreihen unterteilen - und nicht nur entscheiden, ob wir handeln oder nicht, sondern auch, ob wir in dieser Zeit und zu diesem Zeitpunkt auf eine andere Weise handeln. Die Anzeichen für eine Änderung der Taktik sind vielfältig, aber es ist nicht sehr bequem, sie in den Code zu schreiben, und zweitens ist es schwierig, sie visuell zu lesen - man kann eine Menge Fehler machen.

Haben Sie Interesse an einer solchen Idee, um Ihre Talente einzusetzen?

 
Aleksey Vyazmikin:

Was für ein interessantes Zeug... aber wie kann man sie anwenden?

Ah, ich habe eine Idee für grafische Schnittstellen - die Erstellung einer Handelslogik wie ein Entscheidungsbaum! D.h. wir erstellen einen Baum im grafischen Editor (z.B. Shell) und verwenden eine Schaltfläche, um ihn in einfache Regeln oder sogar direkt in Code umzuwandeln! Regeln können aber auch sehr kompakt im Code gelesen werden.

Warum brauchen wir sie? Mit diesem Ansatz lässt sich die Handelsstrategie detailliert beschreiben, z. B. können wir sie leicht in Zeitreihen unterteilen - und nicht nur entscheiden, ob wir handeln oder nicht, sondern auch, ob wir in dieser Zeit und zu diesem Zeitpunkt auf eine andere Weise handeln. Die Anzeichen für eine Änderung der Taktik sind vielfältig, aber es ist nicht sehr bequem, sie in den Code zu schreiben, und zweitens ist es schwierig, sie visuell zu lesen - man kann viele Fehler machen.

Haben Sie Interesse an einer solchen Idee für eine Anwendung Ihrer Talente?

Ich verstehe die Idee eines "grafischen Entscheidungsbaums" nicht. :-) vielleicht ist dein Talent nicht genug :-)

 
Maxim Kuznetsov:

Ich verstehe die Idee des "grafischen Entscheidungsbaums" überhaupt nicht. :-) vielleicht bist du nicht talentiert genug :-)

Stellen Sie sich eine Datentabelle mit einer Reihe von Regeln vor



Diese Regeln sind im Code folgendermaßen angeordnet

      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;
           }
        }

Wenn ein Regelwert und ein berechneter Wert (Indikatorwert/Zeitpunkt/sonstiges Muster) übereinstimmen, wird z.B. eine Handelsaktion durchgeführt.

Diese Methode der Handelsentscheidungen ist sehr kompakt und vielseitig - wir können auf so einfache Weise zum Beispiel viele Strategien kodieren, indem wir ihnen verschiedene magische Symbole geben.

Der Haken an der Sache ist jedoch, dass wir genau die richtige Umgebung für diese Art der Programmierung brauchen. Diese Umgebung sollte wie ein Entscheidungsbaum (ein primitives Blockdiagramm) aussehen, in dem wir Blöcke erstellen können (Berechnungsergebnis z.B.arr_iDelta_Max_D1 mit vordefinierten Werten (1,2,3,4 ...n) und/oder mit der Möglichkeit, Werte von und bis zu begrenzen, um auf diese Weise viele verschiedene Gruppen zu erstellen), von diesem Block aus wird für jeden Wert der Variablen oder Wertebereich der Variablen verzweigt, und so weiter bis zum nächsten Block und so weiter. Wir werden also eine Reihe von Regeln haben, von denen übrigens nicht jede alle Blöcke verwenden muss.

Verstehen Sie jetzt? Wenn Sie Erklärungen benötigen, fragen Sie bitte nach.

 
Aleksey Vyazmikin:

Eine Datentabelle mit einer Reihe von Regeln präsentieren



Diese Regeln sind wie folgt kodiert

Wenn die Regelwerte und die berechneten Werte (Indikatorwert/Zeit/sonstiges Muster) übereinstimmen, wird z.B. eine Handelsaktion durchgeführt.

Diese Methode der Handelsentscheidungen ist sehr kompakt und vielseitig - wir können auf so einfache Weise zum Beispiel viele Strategien kodieren, indem wir ihnen verschiedene magische Symbole geben.

Der Haken an der Sache ist jedoch, dass wir genau die richtige Umgebung für diese Art der Programmierung brauchen. Diese Umgebung sollte wie ein Entscheidungsbaum (ein primitives Blockdiagramm) aussehen, in dem wir Blöcke erstellen können (Berechnungsergebnis z.B.arr_iDelta_Max_D1 mit vordefinierten Werten (1,2,3,4 ...n) und/oder mit der Möglichkeit, Werte von und bis zu begrenzen, um auf diese Weise viele verschiedene Gruppen zu erstellen), von diesem Block aus wird für jeden Wert der Variablen oder Wertebereich der Variablen verzweigt, und so weiter bis zum nächsten Block und so weiter. Wir werden also eine Reihe von Regeln haben, von denen übrigens nicht jede alle Blöcke verwenden muss.

Verstehen Sie jetzt? Wenn Sie Erklärungen benötigen, fragen Sie bitte nach.

Wie Xcos (http://www.scilab.org/en/scilab/features/xcos) und ähnliche ausgefallene Simulationen?
Ich habe es in tcl gesehen - eine Umgebung, in der sie Blöcke mit Pfeilen verbinden... so haben sie Sound/Video/Grafikverarbeitung programmiert. http://wiki.tcl.tk/8565 scheint eine Menge Zeug zu sein, sie haben sogar Maxima in einen Block gesteckt
Wenn ja - werde ich genau aufpassen
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:
Wie Xcos (http://www.scilab.org/en/scilab/features/xcos) und ähnlich modisch in Simulationen ?
Ich habe es in der tcl-Umgebung gesehen, wo sie die Blöcke mit Pfeilen verbinden... so haben sie die Sound-/Video-/Grafikverarbeitung programmiert. http://wiki.tcl.tk/8565 scheint eine Menge Dinge zu sein, sie haben sogar Maxima in einige Blöcke eingebaut
Wenn ja - werde ich genau aufpassen

Ja, das ist der Ansatz! Die Hauptsache ist, die Dinge nicht zu verkomplizieren und einen korrekten Interpreter zu erstellen, so dass alle Blöcke in einer Zeile (einer Verzweigung) zusammengefasst werden, mit der das Programm in MQL bereits funktioniert.

 
Aleksey Vyazmikin:

Ja, das ist der Ansatz! Die Hauptsache ist, die Dinge nicht zu verkomplizieren und einen korrekten Interpreter zu erstellen, so dass alle Blöcke in einer Zeile (einer Verzweigung) zusammengefasst werden, was bereits mit dem Programm in MQL funktioniert.

Ich glaube nicht, dass ich es übermäßig kompliziert machen möchte, z. B. möchte ich mich nicht mit bwise-Code herumschlagen.

Ich werde es höchstens für die Verwendung zusammen mit ATcl anpassen (d.h. Daten von Mql an seine Eingänge übertragen) und die Ausgaben übernehmen.
Natürlich werde ich ein HowTo schreiben müssen, wie man Quadrate zeichnet und sie an EA anhängt. Und üben Sie Englisch, wenn Sie mit dem/den Autor(en) kommunizieren :-)

Grund der Beschwerde: