Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1202

 
Alexey Belyakov:

Buon pomeriggio!

Sto lottando con una domanda, potresti dirmi come risolverla?

L'idea è la seguente: traccio una linea al massimo precedente della candela. Voglio che la linea sia spostata a seconda del massimo precedente.

Chi mi impedisce di cambiare il prezzo della linea sui tick quando ne ho bisogno?

//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   PRH;

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи

  if (rs1 >= rt) // условие для построения уровней (если верхняя тень предыдущей свечи, больше, или равна телу этой же всечи, то...   
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
    Comment("ЦЕНА МАКС =======", PRH, "\n"); // комментарий пред. максимума
  }
}
//+------------------------------------------------------------------+
File:
 
Potete dirmi come fa MT5 a sapere dalla cronologia il prezzo e l'ora del primo trade quando apre una posizione e il prezzo e l'ora del primo trade quando chiude quella posizione? Lo scopo è quello di ottenere un array di punti di ingresso dalla storia, perché a volte l'equità quando il commercio manuale, quindi voglio capire se è efficace o no. Non so nulla delle operazioni di trading, uso una classe, dove queste funzioni non sono state implementate :(
 
Aleksei Beliakov:
Ci sono 2 opzioni
1. Cancellare un oggetto prima di crearlo
2. Impostare un prezzo dopo la creazione dell'oggetto

Ciao omonimo!)


void OnTick()
  {
//---
   double   o1 = iOpen(Symbol(),Period(),1);
   double   h1 = iHigh(Symbol(),Period(),1);
   double   l1 = iLow(Symbol(),Period(),1);
   double   c1 = iClose(Symbol(),Period(),1);
   double   c0 = iClose(Symbol(),Period(),0);
   double   rt = 0;
   double   rs1 = 0;
   double   rs2 = 0;
   
rt=MathAbs(c1-o1)/_Point; //размер тела свечи
rs1=MathAbs(h1-c1)/_Point;// размер верхней тени свечи
rs2=MathAbs(l1-c1)/_Point; // размер нижней тени свечи

ObjectDelete(0,"HL");

if ((rs1>=rt)&&(c1>o1)) //[для ростовых свечей] условие для построения уровней (если верхняя тень предыдущей свечи, больше, или равна телу этой же свечи, то...   
{
double PRH=iHigh(Symbol(),_Period,1); // то это будет максимум
ObjectCreate(0,"HL",OBJ_HLINE,0,_Period,PRH); // и строим по этому максимуму, горизонтальную линию
}

ObjectDelete(0,"lL");

if ((rs2>=rt)&&(c1<o1)) // [для падающих свечей]условие для построения уровней (если нижняя тень предыдущей свечи, больше, или равна телу этой же свечи, то...   
{
double PRL=iLow(Symbol(),_Period,1); // то это будет минимум
ObjectCreate(0,"lL",OBJ_HLINE,0,_Period,PRL); // и строим по этому минимум, горизонтальную линию
}
}

Considerato l'opzione 1, qualcosa di simile. Ma non corretto in qualche modo accade. All'inizio fasi secondo i piani, poi in un colpo di coda.

 
Mihail Matkovskij:

E chi vi impedisce di cambiare semplicemente il prezzo della linea sui tick quando ne avete bisogno?


//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   rs2 = 0;
  double   PRH;
  double   PRL;

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи
  rs2=MathAbs(l1 - c1) / Point();// размер нижней тени свечи

  if ((rs1>= rt)&&(c1>o1)) //условия для растущих свечей
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
  }
  
   if ((rs2>= rt)&&(c1<o1)) //условия для падающих свечей 
  {
    PRL = iLow(NULL, PERIOD_CURRENT, 1);
    hLine.Price(0, PRL);  
  }
  
  
}
//+------------------------------------------------------------------+

Beh, più o meno, sì. Se si aggiungono condizioni solo un po', c'è un problema. Traccia una linea. Quello che serve è: se non c'è un nuovo massimo/basso, viene salvato.

 
Alexey Belyakov:


Beh, più o meno, sì. Se si aggiungono condizioni solo un po', c'è un problema. Traccia una linea. Quello che serve è: se non c'è un nuovo massimo/basso, viene salvato.

Non so, chi ti impedisce di aggiungere un'altra linea per Low...?

//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine, lLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  hLine.Color(clrDarkViolet);
  lLine.Create(0, "lLine", 0, 0);
  lLine.Color(clrDodgerBlue);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   rs2 = 0;
  double   PRH;
  double   PRL;

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи
  rs2=MathAbs(l1 - c1) / Point();// размер нижней тени свечи

  if ((rs1 >= rt) && (c1 > o1)) //условия для растущих свечей
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
  }
  
  if ((rs2 >= rt) && (c1 < o1)) //условия для падающих свечей 
  {
    PRL = iLow(NULL, PERIOD_CURRENT, 1);
    lLine.Price(0, PRL);  
  }
}
//+------------------------------------------------------------------+

Puoi aggiungere un'intera serie di linee o altri oggetti e segnare ogni Low e High con essi. Qual è il problema...?

 
Aleksey Vyazmikin:
Per favore, consigliate come ottenere il prezzo e il tempo della prima transazione quando si apre una posizione e il prezzo e il tempo della prima transazione per chiudere questa posizione dalla storia. Il mio scopo è quello di ottenere un array di punti di ingresso dalla storia, perché a volte l'equità quando faccio trading manualmente, quindi voglio sapere se è efficace o no. Non so nulla delle operazioni di trading, uso una classe, dove queste funzioni non sono state implementate :(

HistorySelectByPosition vi aiuterà a

Allora ci sono diverse opzioni:

  • Prendere scambi, controllare la proprietàDEAL_ENTRY_IN o DEAL_ENTRY_OUT per entrare o uscire dal mercato e prendere il prezzo e il tempo di quello scambio.
  • Prendere ordini. Con l'indice 0 questa è un'entrata nel mercato, rispettivamente OrdersTotal()-1 un'uscita dal mercato.
  • Il modo migliore è prenderli entrambi. Il punto è che se la posizione è aperta con uno slippage, il prezzo di scambio ≠ il prezzo dell'ordine. Di conseguenza, prendete quello che vi serve.
Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть  в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
 
C'è un modo per dichiarare un mucchio di buffer in modo compatto in mt5?
 
Mihail Matkovskij:

Non so, chi ti impedisce di aggiungere un'altra linea per Low...?

Puoi aggiungere un'intera serie di linee o altri oggetti e segnare ogni Low e High con essi. Qual è il problema...?

Sì, funziona correttamente! Grazie Mihail!


E se avete forato la linea di fondo e avete bisogno di cancellarla dopo il piercing, come:

if (c0<PRL)  
  {
  lLine.Delete(0,"lLine"); 
  }

Giusto?

 
Alexey Belyakov:

Sì, funziona come dovrebbe! Grazie Mihail!


E se la linea di fondo è perforata e bisogna cancellarla quando è perforata, come:

Giusto?

Il programma usa solo due linee per evidenziare i livelli. Perché cancellarlo e poi crearlo di nuovo se si può semplicemente impostarlo a 0...?

lLine.Price(0, 0.0);

La linea non sarà visibile sul grafico... E poi puoi mostrarlo di nuovo:

lLine.Price(0, PRL);
 
Mihail Matkovskij:

Il programma usa solo due linee per evidenziare i livelli. Perché cancellare e poi ricreare quando si può semplicemente impostare a 0...?

La linea non sarà visibile sul grafico... E poi puoi mostrarlo di nuovo:

Come questo? O è necessario dichiarare qualcos'altro in OnInit?

if (c0<PRL)  
{
lLine.Price(0,0.0);
}