ATcl - Interprete Tcl per MT4 - pagina 6

 
Maxim Kuznetsov:

In termini di tecnologia software, potenzialmente sì. Le biblioteche possono essere chiamate dall'ottimizzatore finché non si trova nel cloud.

sul lato NS - come te lo immagini?

Nell'ottimizzatore viene fatto un passaggio e i dati vengono scritti nel file, poi si passa alla formazione della rete, dopo la formazione i risultati della valutazione della formazione vengono restituiti a MT4/5 e la rete (regole) viene scritta nel file. E l'altra vista è quando usiamo i file registrati della logica NS per condurre l'ottimizzazione (delle varianti NS) e fissare gli indicatori standard di TS.

 

Ho esteso la demo del grafico Tk - ora mostra anche la tabella degli ordini.

Tabella degli ordini in una finestra separata

Il codice MQL che si riferisce alla tabella degli ordini
- seleziona tutti i suoi ordini e li invia a tcl nel metodo OnOrderList
- nell'output otteniamo 3 liste di ticket - quelli nuovi, quelli che sono cambiati e quelli che sono stati cancellati

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

e il metodo Tcl che fa il lavoro principale:
- ottiene un nuovo elenco di ordini
- confrontare con le chiamate precedenti
- costruisce 3 elenchi (nuovo, cambiato, cancellato).
- crea una tabella ... che in realtà è un albero e può essere fatta in diversi livelli.


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

tutto è molto compatto.
È possibile utilizzare i punti di forza di entrambi i linguaggi - MQL è vicino all'ambiente di trading e conta rapidamente negli array,
Tcl può facilmente gestire liste e hash.
MQL implementa un duro algoritmo di trading mentre gli script gestiscono l'interazione con il mondo e l'utente.

L'archivio è allegato.

File:
atcl.zip  6662 kb
 

Uno script per esportare le citazioni in Excel

Ho fatto un breve script per esportare le citazioni direttamente in Excel.
Senza alcuna voce in CSV o alcun parametro - basta gettarlo sul grafico, il foglio Excel si aprirà e tutte le citazioni saranno copiate in esso.

Ho commentato il testo il più possibile e l'ho allegato. Ho fornito i dettagli dello script sul mio sito web http://nektomk.ru/atcl:ratestoexcel.
Il volume va al di là del forum, per cui ecco. Forse quando sarò in vena lo duplicherò nel blog locale in modo che l'informazione non sia andata persa di sicuro.

Lo script allegato

PS/ Qualcuno ha un file make per la compilazione batch di mql? che cambierà un mqh, spingerà make e ricostruirà un mucchio di mq4 che sono elencati nelle dipendenze...

aggiornato/ duplicato l'articolo sul blog locale https://www.mql5.com/ru/blogs/post/718304 - ora probabilmente non andrà via
RatesToExcel
  • nektomk.ru
Часто возникающий (и довольно практичный) вопрос у пользователей MetaTrader - «Как скопировать котировки в Excel?» . При помощи библиотеки ATcl это программируется довольно легко. В состав библиотеки входит «большая» программа работающая с Excel, но для частых потребностей сделал короткий скрипт, который делает самую простую вещь - экспорт...
File:
 

Il mailer funziona, ma ha ancora bisogno di altro lavoro...

Nel frattempo, una domanda per le persone - il GUI-Builder sarà richiesto?
per Tk, ci sono, ma a causa del fatto che gli script in testo scrivono più velocemente che in disegno, sono poco richiesti.

qualcosa del genere:

PS/ il risultato di tale GUI-builder può essere avviato da MT4...

 
Maxim Kuznetsov:

il mailer funziona, ma ha ancora bisogno di altro lavoro...

ma nel frattempo una domanda per la gente - ci sarà una richiesta di GUI-Builder?
per Tk lo sono, ma a causa del fatto che gli script sono più veloci da scrivere in testo che in disegno non sono molto richiesti.

qualcosa del genere:

PS/ il risultato di un tale GUI-builder e ora con l'aiuto di "tale e tale madre" può essere avviato da MT4...

Che roba interessante... solo come applicarli?

Ah, ho un'idea per le interfacce grafiche - creare una logica di trading come un albero decisionale! Cioè, creare un albero nell'editor grafico (cioè la shell) e usare un pulsante per convertirlo in regole semplici, o anche direttamente in codice! Tuttavia, le regole possono anche essere lette nel codice in modo molto compatto.

Perché ne abbiamo bisogno? Questo approccio permette di dettagliare la strategia di trading, per esempio, possiamo facilmente dividerla in serie temporali - non solo decidendo se commerciare o meno, ma anche se commerciare in questo tempo e in questo tempo in modo diverso. I segni di un cambiamento di tattica sono molti e vari, ma non è molto conveniente scriverlo nel codice e in secondo luogo, è difficile da leggere visivamente - si possono fare molti errori.

Sei interessato a un'idea del genere per applicare il tuo talento?

 
Aleksey Vyazmikin:

Che roba interessante... ma come applicarli?

Ah, ho un'idea per le interfacce grafiche - creare una logica di trading come un albero decisionale! Cioè creiamo un albero nell'editor grafico (cioè la shell) e usiamo un pulsante per convertirlo in regole semplici o anche direttamente in codice! Tuttavia, le regole possono anche essere lette nel codice in modo molto compatto.

Perché ne abbiamo bisogno? Questo approccio permette di dettagliare la strategia di trading, per esempio, possiamo facilmente dividerla in serie temporali - non solo decidendo se commerciare o meno, ma anche se commerciare in questo tempo e in questo tempo in modo diverso. I segni di un cambiamento di tattica sono molti e vari, ma non è molto conveniente scriverlo nel codice e in secondo luogo, è difficile da leggere visivamente - si possono fare molti errori.

Ti interessa un'idea del genere per un'applicazione dei tuoi talenti?

Non capisco l'idea di un "albero decisionale grafico". :-) forse il tuo talento non è sufficiente :-)

 
Maxim Kuznetsov:

Non capisco affatto l'idea dell'"albero decisionale grafico". :-) forse non hai abbastanza talento :-)

Immaginate una tabella di dati con una serie di regole



Queste regole sono disposte nel codice nel modo seguente

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

Se un valore della regola e un valore calcolato (valore dell'indicatore/tempo/altro modello) coincidono, allora viene eseguita un'azione di trading, per esempio.

Questo metodo di decisioni di trading è molto compatto e versatile - possiamo codificare in modo così semplice, per esempio, molte strategie - dando loro diversi simboli magici.

Ma la fregatura è che abbiamo bisogno proprio dell'ambiente per questo stile di programmazione. Questo ambiente dovrebbe assomigliare a un albero decisionale (un diagramma a blocchi primitivo) dove possiamo creare blocchi (risultato del calcolo per esempioarr_iDelta_Max_D1 con valori predefiniti (1,2,3,4 ...n) e/o con possibilità di limitare i valori da e verso, creando molti gruppi diversi in questo modo), da questo blocco si dirama per ogni valore della variabile o intervallo di valori della variabile, e così via fino al blocco successivo e così via. Così, avremo un insieme di regole, ognuna delle quali, tra l'altro, non deve usare tutti i blocchi.

Questo ti fa capire? Se avete bisogno di spiegazioni, chiedete pure.

 
Aleksey Vyazmikin:

Presentare una tabella di dati con una serie di regole



Queste regole sono codificate come segue

Se abbiamo una coincidenza tra i valori delle regole e i valori calcolati (valore dell'indicatore/tempo/altro schema), allora, per esempio, viene eseguita un'azione di trading.

Questo metodo di decisioni di trading è molto compatto e versatile - possiamo codificare in modo così semplice, per esempio, molte strategie - dando loro diversi simboli magici.

Ma la fregatura è che abbiamo bisogno proprio dell'ambiente per questo stile di programmazione. Questo ambiente dovrebbe assomigliare a un albero decisionale (un diagramma a blocchi primitivo) dove possiamo creare blocchi (risultato del calcolo per esempioarr_iDelta_Max_D1 con valori predefiniti (1,2,3,4 ...n) e/o con possibilità di limitare i valori da e verso, creando molti gruppi diversi in questo modo), da questo blocco si dirama per ogni valore della variabile o intervallo di valori della variabile, e così via fino al blocco successivo e così via. Così, avremo un insieme di regole, ognuna delle quali, tra l'altro, non deve usare tutti i blocchi.

Questo ti fa capire? Se avete bisogno di spiegazioni, chiedete pure.

Come Xcos (http://www.scilab.org/en/scilab/features/xcos) e altri simili di fantasia nelle simulazioni?
L'ho visto in tcl - un ambiente in cui collegano i blocchi con le frecce... è così che hanno programmato l'elaborazione del suono/video/grafica. http://wiki.tcl.tk/8565 sembra essere un sacco di roba, hanno anche bloccato Maxima in qualche blocco
Se lo è - presterà molta attenzione
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:
Come Xcos (http://www.scilab.org/en/scilab/features/xcos) e simili alla moda nelle simulazioni?
L'ho visto in tcl - ambiente in cui collegano i blocchi con delle frecce... è così che hanno programmato l'elaborazione audio/video/grafica. http://wiki.tcl.tk/8565 sembra essere un sacco di cose, hanno anche infilato Maxima in qualche blocco
Se lo è - presterà molta attenzione

Sì, questo è l'approccio! La cosa principale è non complicare le cose, e fare un interprete corretto, in modo che tutti i blocchi siano raccolti in una linea (un ramo), con cui il programma in MQL funzionerà già.

 
Aleksey Vyazmikin:

Sì, questo è l'approccio! La cosa principale è non complicare le cose, e fare un interprete corretto, in modo che tutti i blocchi siano raccolti in una linea (un ramo), che funzionerà già con il programma in MQL.

Non credo di voler complicare troppo, per esempio non voglio incasinare il codice bwise.

Al massimo, lo adatterò per usarlo insieme ad ATcl (cioè trasferire i dati da Mql ai suoi ingressi) e prendere le uscite.
Naturalmente, dovrò scrivere qualche HowTo "come disegnare i quadrati e attaccarli a EA". E praticare l'inglese quando si comunica con l'autore(i) :-)