Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1096

 
EgorKim:

Ho il tempo e il prezzo dei punti A e B

Come faccio a sapere l'ora e il prezzo del punto C? È nel mezzo tra A e B.

Non riesco a trovare un esempio da nessuna parte


//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(const int left_bar,const double left_price,const int right_bar,const double right_price,const int bar_to_search) 
  {
   return(right_bar==left_bar ? left_price : (right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
  }
//+------------------------------------------------------------------+
 
EgorKim:

Ho il tempo e il prezzo dei punti A e B

Come faccio a sapere l'ora e il prezzo del punto C? È nel mezzo tra A e B.

Non riesco a trovare un esempio da nessuna parte.


Tempo C = Tempo B - ((Tempo B - Tempo A) / 2)

Prezzo al tempo C

 
Сергей Таболин:

Tempo C = Tempo B - ((Tempo B - Tempo A) / 2)

Prezzo per tempo C

Controllato, a volte ho un fine settimana)

C'è un modo per scoprire il centro nella linea stessa?

Ecco la mia linea

void SetLow(double price_1,double price_2,datetime time_1,datetime time_2)
  {
   ObjectCreate(0,"Low",OBJ_TREND,0,time_2,price_2,time_1,price_1);
   ObjectSetInteger(0,"Low",OBJPROP_COLOR,clrAqua);
   ObjectSetInteger(0,"Low",OBJPROP_WIDTH,2);
   ObjectSetInteger(0,"Low",OBJPROP_STYLE,STYLE_DOT);
   ObjectSetInteger(0,"Low",OBJPROP_BACK,false);
   ObjectSetInteger(0,"Low",OBJPROP_RAY_RIGHT,true);
  }
 
Igor Makanu:

Come si fa a sapere il biglietto dell'ultimo ordine aperto? Non funziona così:

Cosa vuoi sapere esattamente? Dobbiamo distinguere chiaramente tra i termini ORDER, ORDER e POSITION.

Secondo: Avete subito causato confusione nominando gli oggetti della classe CTrade "order_1" " "order_2". Chiamavano gli oggetti della classe CTrade "m_trade_1" e "m_trade_2". Non influisce sull'usabilità, ma aggiunge molta confusione.

Terzo: il metodoPositionClose non funzionerà solo perché gli passate un ticket di posizione uguale a zero (e li inizializzate con zero in OnInit()) - Tali condizioni ideali, quando la prima posizione ha un biglietto "0", possono essere ottenute solo nel tester.

Quarto: Il metodoBuy

Nota

Il completamento con successo del metodo Buy(...) non significa sempre un'operazione di trading riuscita. Si dovrebbe controllare il risultato dell'esecuzione della richiesta di compravendita (codice di ritorno del server di compravendita) chiamando il metodoResultRetcode() e ilvalore restituito dal metodoResultDeal().


MetodoResultDeal()

Ottiene il biglietto READ.

 
Vladimir Karputov:

Cosa vuoi sapere esattamente? È necessario distinguere chiaramente tra i termini ORDER, ORDER e POSITION.

In secondo luogo, avete immediatamente causato confusione nominando gli oggetti della classe CTrade con le parole "order_1" e "order_2". Chiamavano gli oggetti della classe CTrade "m_trade_1" e "m_trade_2". Non influisce sull'usabilità, ma aggiunge molta confusione.

Terzo: il metodoPositionClose non funziona solo perché gli passate un ticket di posizione uguale a zero (e li inizializzate con zero in OnInit()) - Tali condizioni ideali, quando la prima posizione ha un biglietto "0", possono essere ottenute solo nel tester.

Quarto: Il metodoBuy

Nota

Il completamento con successo del metodo Buy(...) non significa sempre un'operazione di trading riuscita. Si dovrebbe controllare il risultato dell'esecuzione della richiesta di compravendita ( codice di ritorno del server di compravendita) chiamando il metodo ResultRetcode() e ilvalore restituito dal metodoResultDeal().


MetodoResultDeal()

Ottiene il biglietto RECEIVED.

Grazie! L'ho già capito

in generale, il problema era dovuto all'abbondanza di informazioni, pettegolezzi e opportunità.... era sicuro che non sarei stato in grado di catturare un biglietto in Result(), perché l'evento OnTradeTransaction() viene ricordato ogni tanto ... e si comincia!

Attualmente ci sto lavorando con MT5 tester, sto solo cercando esempi riproducibili, non sto parlando del codice funzionale - solo un tester per ora

grazie ancora per il vostro aiuto!

questo codice può ottenere i biglietti degli ultimi ordini nel tester:

//+------------------------------------------------------------------+
//|                                                   tst_CTrade.mq5 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"

input double Lot_1 = 0.10;
input double Lot_2 = 0.20;
input ulong  Magic1 = 12345;
input ulong  Magic2 = 67890;
#include<Trade\Trade.mqh>
 CTrade order_1,order_2;
ulong   ticket_1,ticket_2;
//_______________________________________________________________________ 
class CNewbar
  {
private:
   datetime          mnewtime;
   ENUM_TIMEFRAMES   mperiod;
public:
                     CNewbar()                        { mperiod=PERIOD_CURRENT;  mnewtime=TimeCurrent(); }
                     CNewbar(ENUM_TIMEFRAMES period)  { mperiod=period;          mnewtime=TimeCurrent(); }
   bool              NewBar(){ datetime t=iTime(NULL,mperiod,0); if(mnewtime<t){ mnewtime=t; return(true); } return(false);  }
  };
//_______________________________________________________________________ 

CNewbar Bar_H1(PERIOD_H1);
CNewbar Bar_M30(PERIOD_M30);
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   order_1.SetExpertMagicNumber(Magic1);
   order_2.SetExpertMagicNumber(Magic2);
   ticket_1 = 0;
   ticket_2 = 0;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(Bar_H1.NewBar())
     {
      order_1.PositionClose(ticket_1);
      if(order_1.Buy(Lot_1))
        {
         ticket_1=order_1.ResultOrder();
         Print("NewBar H1, ticket_1 = ",ticket_1);
        }
     }

   if(Bar_M30.NewBar())
     {
      order_2.PositionClose(ticket_2);
      if(order_2.Sell(Lot_2))
        {
         ticket_2=order_2.ResultOrder();
         Print("NewBar M30, ticket_2 = ",ticket_2);
        }
     }
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

Grazie! L'ho già capito.

in generale il problema era dovuto all'abbondanza di informazioni, pettegolezzi e possibilità.... era sicuro che non potevo prendere il biglietto in Result(), perché l'evento OnTradeTransaction() viene ricordato ogni tanto ... e si comincia!

Attualmente ci sto lavorando con MT5 tester, sto solo cercando esempi riproducibili, non sto parlando del codice funzionale - solo un tester per ora

grazie ancora per il vostro aiuto!

Tale codice può ottenere i tick degli ultimi ordini nel tester:

Sì, usando ResultOrder si ottiene il biglietto d'ordine.

 
Vladimir Karputov:

Sì, con ResultOrder possiamo ottenere un biglietto per l'ordine.

Ok, ora non ho nessun problema, ma è apparso un altro problema quando uso CTrade: ho un ordine memorizzato e posso chiuderlo usando PositionClose(m_ticket)

In MQL4, era molto facile scoprire se l'ordine è chiuso o no. L'ho selezionato usando OrderSelect() e ho controllato if(OrderCloseTime()>0) - se il tempo di chiusura non è uguale a 0, l'ordine è chiuso

Come faccio a sapere se un ordine è chiuso usando SB CTrade?

 
Igor Makanu:

OK, ora non ho problemi, ma è apparso un altro problema quando uso CTrade: ho un ticket di ordini memorizzato e posso chiuderlo usando PositionClose(m_ticket)

In MQL4, era abbastanza semplice: selezionavo l'ordine tramite OrderSelect() e controllavo se(OrderCloseTime()>0) - se il tempo di chiusura non è uguale a 0, l'ordine viene chiuso

come faccio a sapere che l'ordine è chiuso usando SB CTrade?

Dimenticate l'ordine! C'è una posizione!

Ho chiesto specificamente che cosa volete: un ORDINE, una PRESA O una POSIZIONE? Non confondete la terminologia. Dopo l'esecuzione dell'ordine di compravendita, appare la POSIZIONE, non l'ORDINE!


Quindi, prima descrivete a parole quello che state facendo e quello che volete ottenere. Invece di un ORDINE, usate "ordine di acquisto" e "ordine di vendita". Questo si traduce in una posizione "BUY" o "SELL".

 
Igor Makanu:

OK, ora non ho problemi, ma è apparso un altro problema quando uso CTrade: ho un ticket di ordini memorizzato e posso chiuderlo usando PositionClose(m_ticket)

In MQL4, era molto facile scoprire se l'ordine è chiuso o no. L'ho selezionato usando OrderSelect() e ho controllato if(OrderCloseTime()>0) - se il tempo di chiusura non è uguale a 0, l'ordine è chiuso

Come faccio a sapere se un ordine è chiuso usando SB CTrade?

Tralasciando il fatto che un ticket di posizione di solito corrisponde a un ticket d'ordine, ma non sempre, è possibile utilizzare la funzione PositionSelectByTicket senza SB

Документация по MQL5: Торговые функции / PositionSelectByTicket
Документация по MQL5: Торговые функции / PositionSelectByTicket
  • www.mql5.com
Выбирает открытую позицию для дальнейшей работы с ней по указанному тикету. Возвращает true при успешном завершении функции. Возвращает false при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Функция PositionSelectByTicket() копирует данные о позиции в программное окружение, и...
 
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

Posso sostituire la mia formula di calcolo in questo codice di calcolo dell'indicatore?

Per esempio open/2

Motivazione: