Autoapprendimento del linguaggio MQL5 da zero - pagina 58

 
MrBrooklin:

Ho creato un modello standard. È dove ho iniziato a scrivere il codice, e qui ho iniziato a postare quei frammenti che sono già stati scritti. Non ho pensato al framework degli algoritmi con le mie funzioni, grazie per il suggerimento! Grazie anche per la dritta sul conto di rete!


C'è una tale tecnica di alfabetizzazione-programmazione che permette di scrivere molto velocemente e in modo intelligente.

In generale, in stile letterario, scrivete nei commenti quello che farete (solo la sequenza diretta principale)

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

Fondamentalmente tutti. Inoltre dopo ogni commento si scrive un codice di 3-5 (un po' in generale) righe. Tutta la tua funzione dall'inizio alla fine dovrebbe rientrare nella schermata che vedi. Se si ottiene di più, significa che i frammenti devono essere separati in funzioni/metodi separati.

Quando una cosa così elementare comincia a funzionare nel tester, si può generalizzare, aggiungere condizioni dalla vita reale, cambio di passo o frequenza per esempio, prendere in considerazione le condizioni del mercato, non c'è limite alla perfezione...

 
Maxim Kuznetsov:

astratto, c'è una tecnica di alfabetizzazione-programmazione che permette di scrivere molto velocemente e chiaramente.

In generale, in stile letterario, scrivi nei commenti quello che farai (solo la sequenza diretta principale)

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

Fondamentalmente tutti. Inoltre, dopo ogni commento si scrive un codice di 3-5 righe (un po' in generale). Tutta la tua funzione dall'inizio alla fine dovrebbe rientrare nella schermata che vedi. Se si ottiene di più, significa che i frammenti devono essere separati in funzioni/metodi separati.

Quando una cosa così elementare comincia a funzionare nel tester, si può generalizzare, aggiungere condizioni dalla vita reale, cambio di passo o frequenza per esempio, prendere in considerazione le condizioni di mercato, non c'è limite alla perfezione...

Ciao Maxim, sei molto utile con il tuo consiglio! Sono seduto qui a chiedermi come riempire un modello standard di EA.

Saluti, Vladimir.

 
MrBrooklin:

Cari esperti di programmazione!

Per favore, spiega due domande:

  1. Prima domanda sul Magic Number - è creato nei parametri di input solo per gli ordini pendenti e le posizioni aperte (o solo per le posizioni aperte?), o anche per l'EA stesso può essere creato? Se la risposta è "sì", per quale scopo dovrebbe essere fatto. Mi sono davvero confuso con questa domanda e non ho una buona risposta.
  2. La seconda domanda sul Magic Number - se c'è più di una posizione aperta nel grafico corrente, allora è possibile applicare un tale parametro di input per determinare ogni posizione:

Forse ho una comprensione sbagliata dell'applicazione del numero magico nella programmazione.

Sinceramente, Vladimir.

Quando un ordine viene accettato per l'esecuzione tutte le sue caratteristiche (simbolo, tempo, tipo di ordine, ticket) sono assegnate dal terminale (richieste dall'utente e assegnate dal terminale) e non dall'utente e lo stesso con la posizione, la posizione immagazzina informazioni sui suoi ordini ma ce ne possono essere molti. E il numero magico è un identificatore dell'utente. Citazione:

Quando creiamo una nuova richiesta in sospeso, abbiamo bisogno di contrassegnarla in qualche modo - così il programma può sapere che questo particolare ordine è stato piazzato da NAMI su questa particolare richiesta in sospeso - cioè, abbiamo bisogno di identificare e associare in modo univoco un ordine o una posizione con una particolare richiesta in sospeso.

Il NAMI manca nel significato. E poi Artem mette la classificazione degli ordini nel numero di Magik. Perché no, le prime 2 cifre indicano qualcosa, per esempio il tipo di ordine, le successive 4 cifre indicano la data dell'ordine.

Per quanto riguarda l'algoritmo di qualcosa. Definite inizialmente le condizioni iniziali. Ci sono ordini sul nostro simbolo e non li prendiamo in considerazione o li prendiamo in considerazione. Senza condizioni iniziali rilavorazione quando si crea l'algoritmo, e ancora di più il codice può essere eterno)

 
Maxim Kuznetsov:

astratto, c'è una tecnica di alfabetizzazione-programmazione che permette di scrivere molto velocemente e in modo intelligente.

In generale, stile alfabetizzazione-programmazione, scrivi nei commenti quello che farai (solo la sequenza principale diretta) ...

... Fondamentalmente tutti. Poi, dopo ogni commento scrivete 3-5 righe di codice (non molto in generale). L'intera funzione, dall'inizio alla fine, dovrebbe rientrare nella schermata che vedete. Se si ottiene di più, significa che bisogna separare i frammenti in funzioni/metodi separati.

Maxim, per favore controlla se ho capito bene il tuo suggerimento o c'è qualcos'altro che devo aggiungere? Intendo la parte del test, perché non ho ancora scritto i codici.

Saluti, Vladimir.

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
// установим входные параметры: "Уровень перестановки Stop Loss в безубыток" и "Шаг трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---

// 1. берём позицию Buy
// 2. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 4. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 
MrBrooklin:

Maxim, vedi se ho capito bene il tuo suggerimento o c'è qualcos'altro che devo aggiungere? Intendo la parte del test, a parte i codici.

Sinceramente, Vladimir.

Condizioni iniziali. Calcoliamo che c'è una posizione sul nostro simbolo e la vediamo sul grafico.

Se abbiamo una posizione, è solo una, o comprare o vendere. Perciò iniziamo a cercare le posizioni sul nostro simbolo. Richiedere/ottenere caratteristiche. Determinazione del tipo di posizione - comprare o vendere. E così via attraverso il testo.

 
Valeriy Yastremskiy:

Quando un ordine viene accettato per l'esecuzione tutte le sue caratteristiche (simbolo, ora di emissione, tipo di ordine, ticket) sono assegnate dal terminale (richieste dall'utente e assegnate dal terminale), non dall'utente, e lo stesso con la posizione, la posizione memorizza informazioni sui suoi ordini, ma ce ne possono essere molti. E il numero magico è un identificatore dell'utente. Citazione:

Quando creiamo una nuova richiesta in sospeso, abbiamo bisogno di contrassegnarla in qualche modo - così il programma può sapere che questo particolare ordine è stato piazzato da NAMI su questa particolare richiesta in sospeso - cioè, abbiamo bisogno di identificare e associare in modo univoco un ordine o una posizione con una particolare richiesta in sospeso.

Il NAMI manca nel significato. E poi Artem mette la classificazione degli ordini nel numero di Magik. Perché no, le prime 2 cifre indicano qualcosa, per esempio il tipo di ordine, le successive 4 cifre indicano la data dell'ordine.

Per quanto riguarda l'algoritmo di qualcosa. Definite inizialmente le condizioni iniziali. Ci sono ordini sul nostro simbolo e non li prendiamo in considerazione o li prendiamo in considerazione. Senza la rielaborazione delle condizioni iniziali quando si crea l'algoritmo, e ancora di più, il codice può richiedere una vita)

Grazie, Valeriy, per la risposta dettagliata. Molte cose sono diventate più chiare. La penso come te sull'algoritmo, ma Vassily ha già spiegato perché non abbiamo bisogno di Magic Number in questo EA.

Saluti, Vladimir

 
MrBrooklin:

Grazie, Valery, per la risposta dettagliata. Si è schiarito molto. Ho la stessa opinione sull'algoritmo, ma Vasiliy ha già spiegato perché non abbiamo bisogno di Magic Number in questo EA.

Sinceramente, Vladimir.

Abbiamo aperto un grafico e c'è una posizione sul simbolo del grafico, non sappiamo cosa sia e vogliamo aprirla a breakeven e poi tracciare SL per ridurre le perdite nel caso il prezzo si inverta.

 

Con le correzioni di Valery, il modello EA con i commenti ha assunto un nuovo aspetto.

Saluti, Vladimir.

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
// установим входные параметры для "Уровня перестановки Stop Loss в безубыток" и "Шага трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---
// 1. ищем все позиции на текущем символе:
//    - отправляем запрос на сервер и получаем характеристики открытых позиций
//    - определяем тип открытой позиции - Buy или Sell 
// 2. берём позицию Buy
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 4. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 5. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 

Vladimir, non devi imbrigliarlo a lungo. Entriamo in azione. Ho scritto un modello del trailing desiderato per voi:

//+------------------------------------------------------------------+
//|                                                  TestingTral.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MrBrooklin"
#property link      "http://www.mql5.com"
#property version   "1.00"
input double BreakevenValue = 100.0; // Величина безубытка, в пунктах инструмента
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //-- Выбираем позиции по текущему символу. Если позиции нет выбирать нечего - выходим
   if(!PositionSelect(Symbol()))
      return;
   //-- Стоп-лосс длинной позиции переставляем в безубыток и тралим его
   if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
   {
      SetBreakevenForBuyPosition();
      TrailingStopLossForBuyPosition();
   }
   //-- Стоп-лосс короткой позиции переставляем в безубыток и тралим его
   else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
   {
      SetBreakevenForSellPosition();
      TrailingStopLossForSellPosition();
   }
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции BUY в безубыток                         |
//+------------------------------------------------------------------+
void SetBreakevenForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции SELL в безубыток                        |
//+------------------------------------------------------------------+
void SetBreakevenForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+

Tutto quello che dovete fare è riempire le funzioni con la logica corrispondente ai loro nomi. Come potete vedere il modello è elementare. E strutturalmente simile al ToR.

Notate che questo codice si compila, cioè, dal punto di vista del compilatore, è corretto. Sforzatevi sempre di raggiungere questo stato: cioè fate piccole modifiche durante lo sviluppo, in modo che dopo averle fatte, il codice possa essere compilato. Sforzatevi anche di fare in modo che il compilatore riporti "0 errori, o avvertimenti". È chiaro che non si può eseguire il programma con errori, ma gli avvertimenti del compilatore devono essere percepiti come la preghiera del Padre nostro: se c'è un avvertimento deve essere corretto. Questo modello è fatto con "0 errori, o avvertimenti" - salva questo stato fino alla fine dello sviluppo.

Una volta che abbiamo capito la logica e abbiamo capito il compilatore, tutto quello che dobbiamo fare è dotare le funzioni della logica di cui abbiamo bisogno.

Il secondo parametro, il valore della traccia, sarà spostato alla prossima versione per ora. Richiederà ulteriori calcoli. Ecco perché non è presente in questo modello. La rete a strascico sarà tirata su ad ogni spunta.

 
Vasiliy Sokolov:

Vladimir, non devi imbrigliarlo a lungo. Entriamo in azione. Ho scritto un modello del trailing desiderato per voi:

Tutto quello che dovete fare è riempire le funzioni con la logica corrispondente ai loro nomi. Come vedete il modello è elementare. E strutturalmente simile al ToR.

Notate che questo codice si compila, cioè dal punto di vista del compilatore è corretto. Sforzatevi sempre di raggiungere questo stato: cioè fate piccole modifiche durante lo sviluppo, in modo che dopo averle fatte, il codice possa essere compilato. Sforzatevi anche di fare in modo che il compilatore riporti "0 errori, o avvertimenti". È chiaro che non si può eseguire il programma con errori, ma gli avvertimenti del compilatore devono essere percepiti come la preghiera del Padre nostro: se c'è un avvertimento deve essere corretto. Questo modello è fatto con "0 errori, o avvertimenti" - salva questo stato fino alla fine dello sviluppo.

Una volta che abbiamo capito la logica e abbiamo capito il compilatore, tutto quello che dobbiamo fare è dotare le funzioni della logica necessaria.

Il secondo parametro, il valore della traccia, sarà spostato alla prossima versione per ora. Richiederà ulteriori calcoli. Ecco perché non è presente in questo modello. La rete a strascico sarà aggiornata ogni tick.

Vasiliy, naturalmente voglio ringraziarti per aver fatto tanto lavoro, ma non mi aiuta a capire da dove vengono queste funzioni e operatori e, soprattutto, perché sono lì. Sarebbe stato più corretto arrivare al punto di scrivere quel codice, cosa che mi avete suggerito. Volevo davvero arrivare a questo punto da solo e ora voglio farlo.

Capisco che tu, come molti altri, sei stanco del mio continuo scandire tutte le linee di codice e calpestare il punto, ma il problema è che non ho ancora capito come tutto è costruito, dall'algoritmo alla scrittura del codice. Devo aggiungere la mancanza di conoscenza dell'inglese al problema, perché devo copiare e incollare quasi tutti i messaggi di errore e di avvertimento del compilatore, e altre parole inglesi in Google Translator. A proposito, se qualcuno ha provato a eseguire quei micro, anche nano-codici che ho postato in questo thread, tutti hanno passato la compilazione con "0 errori, 0 avvertimenti".

Ora ho bisogno di un po' di tempo per realizzare, o meglio per capire perché sono apparse queste funzioni e operatori. Quindi, in breve, è un orrore silenzioso. E io sono un cattivo studente quando non capisco le cose elementari.

Grazie a te e a tutti gli altri programmatori per aver tollerato la mia lentezza. Anche se mi rendo conto che la vostra pazienza non è infinita.

Sinceramente, Vladimir.