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

 

Perché l'EA non può cambiare il prezzo dell'ordine pendente (sell stop) in uno più redditizio?


Ecco la funzione che definisce la necessità di spostare il prezzo aperto di un ordine pendente

if(orders_total > 0 && position_total == 0)
     {
      OrderGetTicket(0)
      if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_STOP)
        {
         if(OrderGetDouble(ORDER_PRICE_OPEN) - SymbolInfoDouble(_Symbol,SYMBOL_ASK) > ((double)(dist+1)) * _Point) Mode_Order("M",SymbolInfoDouble(_Symbol,SYMBOL_ASK) + ((double)dist * _Point));
        }
      else if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP)
        {
         if(SymbolInfoDouble(_Symbol,SYMBOL_BID) - OrderGetDouble(ORDER_PRICE_OPEN) > ((double)(dist+1)) * _Point) Mode_Order("M",SymbolInfoDouble(_Symbol,SYMBOL_BID) - ((double)dist * _Point));
        };
     };


... e questa è la funzione che muove già il prezzo aperto dell'ordine pendente

void Mode_Order(string act, double price)
  {
   
   MqlTradeRequest request; ZeroMemory(request);
   MqlTradeResult  result;  ZeroMemory(result);
   
   request.symbol = _Symbol;
   
   if(act == "S")
     {
      request.action   = TRADE_ACTION_SLTP;
      request.position = PositionGetTicket(0);
      request.sl       = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY ? PositionGetDouble(POSITION_PRICE_OPEN) - ((double)stop * _Point) : PositionGetDouble(POSITION_PRICE_OPEN) + ((double)stop * _Point));
      request.tp       = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY ? PositionGetDouble(POSITION_PRICE_OPEN) + ((double)profit * _Point) : PositionGetDouble(POSITION_PRICE_OPEN) - ((double)profit * _Point));
     }
   else
     {
      request.action   = TRADE_ACTION_MODIFY;
      request.position = OrderGetTicket(0);
      request.price    = NormalizeDouble(price,_Digits);
     };
   
   if(!OrderSend(request,result)) Print("Не удалось изменить параметры ордера. Код ошибки "+(string)result.retcode);
   
  }
 
Alexandr Sokolov:

Perché l'EA non può cambiare il prezzo dell'ordine pendente (sell stop) in uno più redditizio?


Ecco la funzione che definisce la necessità di spostare il prezzo aperto di un ordine pendente


... E questa è la funzione che muove già il prezzo aperto dell'ordine pendente

Questo ordine è l'unico? La modifica SLTP funziona? Se no, il take e lo stop devono essere normalizzati

dist1 è uguale a cosa? Qui si dovrebbe impostare l'ordine invece della posizione

request.position = OrderGetTicket(0);
 
Aleksey Mavrin:

L'ordine è l'unico? La modifica SLTP funziona? Se no, si dovrebbe normalizzare la presa e smettere

dist1 è uguale a cosa? Dovremmo impostare l'ordine invece della posizione

Grazie mille! Non l'avevo notato, sembra un'inezia - ma non funziona senza


... L'ordine è l'unico, tutto funziona, l'unico problema era spostare l'ordine pendente

 
Alexandr Sokolov:

Grazie mille! Non l'avevo notato, apparentemente una piccola cosa - ma non funziona senza di essa


... L'ordine è l'unico, tutto funziona, l'unico problema era spostare l'ordine pendente

1. Per favore 2. Hmm, lo normalizzerò comunque, contro il peccato. Il vostro prezzo è ottenuto dall'intero moltiplicato per un doppio normalizzato, nel caso generale apparentemente si ottiene anche un doppio normalizzato, ma ho letto da qualche parte che non sempre, un paio di volte all'anno può ottenere

qualcosa come 1,1325000000000000000000001

e poi guai, al momento giusto, quando la tendenza più potente non funziona, e il mutuo di nuovo, ciao)))

Potrei sbagliarmi, ma io stesso rassicuro e normalizzo sempre.

 
Aleksey Mavrin:

1. Per favore 2. Hmmm, sto normalizzando comunque per amore del peccato. Si ottiene il prezzo da un intero moltiplicato per un doppio normalizzato, nel caso generale apparentemente si ottiene anche un doppio normalizzato, ma ho letto da qualche parte che non sempre, un paio di volte all'anno si potrebbe ottenere

qualcosa come 1,1325000000000000000000001

e poi guai, al momento giusto, quando la tendenza più potente non funziona, e il mutuo di nuovo, ciao)))

Potrei sbagliarmi, ma io stesso rassicuro e normalizzo sempre.

Le operazioni matematiche su due numeri normalizzati danno risultati non normalizzati.

Per ottenere un risultato normalizzato di operazioni matematiche con numeri reali, dovete restituire il valore normalizzato di queste operazioni matematiche.

Norm(1.11111) + Norm(2.22222) = NoNorm(res)

Norm(1.11111 + 2.22222) = Norm(res)

 

@ Artyom Trishkin

Ho allegato il codice con questo tema.

Ho trovato il suo codice nella base di codice. C'è stato un problema quando si è cambiato il codice.

La parte di input ha le seguenti voci:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input eTradeType                                    Inp_element_12357534       = TRADETYPE_BUY;                        // First Trade Type
input double                                        Inp_element_3632865        = 0.01;                                 // Start Lot
input double                                        Inp_element_12844407       = 1.0;                                  // Lot Multiplier
input #ifdef __MQL4__ int #else long #endif          Inp_element_2542795        = 400;                                  // Grid Step, points
input #ifdef __MQL4__ int #else long #endif          Inp_element_3135636        = 100;                                  // Target, points
input #ifdef __MQL4__ int #else long #endif          Inp_element_3634918        = 7373;                                 // Magic
sinput string                                       Inp_element_3640359        = "Grid EA";                            // Comment
//+------------------------------------------------------------------+

Voglio che questo parametro cambi mentre il programma è in esecuzione: input #ifdef __MQL4__ INT #else long #endif Inp_element_2542795 = 400 // Step grid, punti.

Per favore, fatemi sapere cosa posso fare per cambiare questo parametro ogni volta che lo eseguo.

File:
Manage.mq5  859 kb
 
jaffer wilson :

@ Artyom Trishkin

Ho allegato il codice con questo tema.

Ho trovato il suo codice nella base di codice. C'è stato un problema quando si è cambiato il codice.

La parte di input ha le seguenti voci:

Voglio che questo parametro cambi mentre il programma è in esecuzione: input #ifdef __MQL4__ INT #else long #endif Inp_element_2542795 = 400 // Step grid, punti.

Per favore, fatemi sapere cosa posso fare per cambiare questo parametro ogni volta che lo eseguo.

Onestamente, la domanda non è chiara.

Vuoi cambiare il parametro di ingresso Inp_element_2542795 ogni volta che avvii il consulente?

Beh, cambialo nelle impostazioni dell'advisor quando si avvia. Oppure, se il consulente è già in funzione, e vuoi cambiare questo parametro, allora premi F7 - apparirà la finestra delle impostazioni del consulente, e cambia questo parametro in essa.

 
Artyom Trishkin:

Onestamente, la domanda non è chiara.

Vuoi cambiare il parametro di ingresso Inp_element_2542795 ogni volta che avvii il consulente?

Beh, cambialo nelle impostazioni dell'advisor quando si avvia. Oppure, se il consulente è già in funzione, e vuoi cambiare questo parametro, allora premi F7 - apparirà la finestra delle impostazioni del consulente, e cambia questo parametro in essa.

Lasciatemi chiarire. Credo che il problema sia la traduzione. In realtà, è un valore di input e non sto capendo dove questo valore viene usato per il calcolo. Non voglio che ogni volta si usino 400 punti. Voglio continuare a cambiare i valori. Voglio cambiare i valori con un calcolo adeguato. Potete aiutarmi dove posso fare delle modifiche in modo che il valore diventi dinamico durante l'esecuzione del programma?

 
jaffer wilson :

Lasciatemi chiarire. Penso che il problema sia nella traduzione. In realtà è un valore di input. e non capisco dove questo valore viene usato per calcolare. Non voglio che 400 punti siano usati ogni volta. Voglio continuare a cambiare i valori. Voglio cambiare i valori per un calcolo adeguato. Potete aiutarmi dove posso fare delle modifiche in modo che il valore diventi dinamico mentre il programma è in esecuzione?

Creare una nuova variabile globale. Impostare il valore del parametro di ingressoInp_element_2542795 su di esso:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
cRunner *Runner;
long g_element_2542795=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//===============
   g_element_2542795=Inp_element_2542795;
//===============
/* DEBUG MACROS' START */ TRACEERRORS_START
//===============
 
//===============
   Runner=new cRunner;
//===============
 

e sostituire l'intera voce della stringa Inp_element_2542795 con questa nuova variabile g_element_2542795 usando Ctrl + H

 

Ciao!

Sto imparando MQL5, quindi chiedo aiuto.

C'è una classe -https://www.mql5.com/ru/code/18721(Vlad Karputova). Grazie a Vladimir.

Calcola il profitto (in punti, in valuta di deposito, swap e commissione), ma non ha un filtro per Magik.

Ho aggiunto il filtro per Magik (non sono sicuro che sia corretto, quindi non voglio postarlo con errori).

Ho ottenuto il risultato.

Search deals with POSITION_IDENTIFIER 53821539
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11164, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11170, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.18
Profit in points -6.0, commission -0.10, swap 0.00, profit -0.18

Search deals with POSITION_IDENTIFIER 53821617
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11159, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11172, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.39
Profit in points -13.0, commission -0.10, swap 0.00, profit -0.39

Search deals with POSITION_IDENTIFIER 53821750
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11163, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11169, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.18
Profit in points -6.0, commission -0.10, swap 0.00, profit -0.18

Search deals with POSITION_IDENTIFIER 53847372
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10971, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11002, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.93
Profit in points -31.0, commission -0.10, swap 0.00, profit -0.93

Search deals with POSITION_IDENTIFIER 53848455
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10997, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.10741, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit 7.68
Profit in points 256.0, commission -0.10, swap 0.00, profit 7.68

Search deals with POSITION_IDENTIFIER 53856130
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10735, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.10769, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -1.02
Profit in points -34.0, commission -0.10, swap 0.00, profit -1.02
All_Profit in points 166.0, All_commission -0.60, All_swap 0.00, All_profit 4.98
All_Profit in points 0.0, All_commission 0.00, All_swap 0.00, All_profit 0.00

I risultati della classe originale e della classe con filtro di Magik coincidono. Ma c'è un punto qui.

1.Perché OUT trades ha zero magia.

2.Se ho corretto erroneamente la classe (aggiungendo un magik) - per favore fai la modifica richiesta alla classe originale e postala.

(E sarebbe bene passare un simbolo alla classe come parametro).

Grazie per l'aiuto.

HistoryPositionInfo version 2
HistoryPositionInfo version 2
  • www.mql5.com
Новое в версии 2: функция GetProfitInPoints осталась, но рекомендуется теперь использовать новую функцию GetProfit: Функция GetProfit возвращает для восстановленной позиции, кроме прибыли в пунктах: комиссию, своп и прибыль в деньгах. Класс CHistoryPositionInfo предназначен для получения прибыли позиции в пунктах, комиссии, свопа и прибыли в...