Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
e dove esiste tutto questo? lo scrivi da qualche parte in una variabile o in un array? mostrami prima dove lo memorizzi, poi potrai vedere cosa fare dopo.
Ok, allora scomponiamolo: c'è un tempo di chiusura degli ordini, c'è un biglietto o un numero di ordini che coincide con il tempo di chiusura. Come possiamo combinare e calcolare il profitto di questi ordini?
Sembra facile, ma ancora non lo capisco.
Finora nessuno riesce a capire quali sono evidenziati in rosso. Abbiamo bisogno dei criteri esatti per trovare questi ordini. Quindi cercate di spiegare, come si dice sulle dita, con immagini e così via.
?
Perché nessuno riesce a capire questo, probabilmente intendi te stesso?
Tutto è chiaro ormai da molto tempo.
La signora vuole solo fare da sola, senza ostentare i dettagli del suo programma.
Finora nessuno riesce a capire quali sono evidenziati in rosso. Abbiamo bisogno di criteri precisi per trovare questi ordini. Per questo motivo, cercate di spiegare, come si dice sulle dita, con immagini e così via
Sì, ho già dato una condizione di lavoro al 100% e l'ho allegata come codice pronto. Dovreste anche notare che il codice usa un metodo che non è influenzato dai riavvii del terminale, e nulla sarà perso quando il terminale è acceso e continuerà a funzionare. Ma qui inventano una ruota che funzionerà solo nel tester.
Sergey, nota anche che nel codice originale di TS quando chiudi una serie di 5 posizioni, anche l'ordine nel mezzo della chiusura viene cancellato, questo a sua volta non porterà a nulla di buono nel trading reale. In generale, tutto è chiaro per tutti, tranne che per TS.
//| Natashe4ka.mq4 |
//| Sergey Gritsay |
//| https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link "https://www.mql5.com/ru/users/sergey1294"
#property version "1.00"
#property strict
input int Magic=1;//Identification number
double Profit=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
color ProfitColor=0;
// START //
LastProfitCL_1(Profit,TimeCurrent(),-1);
if(Profit<0)ProfitColor=clrRed;
else if(Profit>0)ProfitColor=clrLimeGreen;
else ProfitColor=clrDarkGray;
ObjectCreate("Last Profit",OBJ_LABEL,0,0,0);
ObjectSet("Last Profit",OBJPROP_CORNER,1);
ObjectSet("Last Profit",OBJPROP_XDISTANCE,5);
ObjectSet("Last Profit",OBJPROP_YDISTANCE,15);
ObjectSetText("Last Profit",StringConcatenate("Last Profit: ",DoubleToStr(Profit,2)),10,"Arial",ProfitColor);
// END START //
}
//+------------------------------------------------------------------+
//Вариант 1
//+------------------------------------------------------------------+
bool LastProfitCL_1(double &LastProfit,//сюда записываем профит
datetime timecurent,// текущее время
int op=-1//"op" позиция (-1 любая позиция)
)
{
double profit=0;
int cnt=0;
datetime timecurents=0;
int total=OrdersHistoryTotal();
for(int i=total-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
if(OrderType()>1)continue;// исключим удаленные отложенные ордера
if(OrderCloseTime()!=timecurent)continue;
if(OrderType()==op || op==-1)
{
profit+=OrderProfit()+OrderCommission()+OrderSwap();
cnt++;
}
}
if(cnt!=0)
{
LastProfit=profit;
return(true);
}
return(false);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Вариант 2 |
//+------------------------------------------------------------------+
bool LastProfitCL_2(double &LastProfit,//сюда записываем профит
datetime timecurent,// текущее время
int op=-1//"op" позиция (-1 любая позиция)
)
{
double profit=0;
int cnt=0;
datetime timecurents=0;
int total=OrdersHistoryTotal();
if(OrderSelect(total-1,SELECT_BY_POS,MODE_HISTORY))
{
timecurents=OrderCloseTime();
}
for(int i=total-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
if(OrderCloseTime()<timecurents)continue;
if(OrderType()>1)continue;// исключим удаленные отложенные ордера
if(OrderType()==op || op==-1)
{
profit+=OrderProfit()+OrderCommission()+OrderSwap();
cnt++;
}
}
if(cnt!=0)
{
LastProfit=profit;
return(true);
}
return(false);
}
//+------------------------------------------------------------------+
Corretta la seconda versione della funzione
datetime timecurent,// текущее время
int op=-1//"op" позиция (-1 любая позиция)
)
{
double profit=0;
int cnt=0;
datetime timecurents=0;
int total=OrdersHistoryTotal();
for(int i=total-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
if(OrderType()>1)continue;// исключим удаленные отложенные ордера
if(OrderType()!=op && op!=-1)continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
if(timecurents==0)timecurents=OrderCloseTime(); // запомним время последнего закрытого ордера
if(OrderCloseTime()<timecurents)continue;
profit+=OrderProfit()+OrderCommission()+OrderSwap();
cnt++;
}
if(cnt!=0)
{
LastProfit=profit;
return(true);
}
return(false);
}
..........
Corretta la seconda versione della funzione
Grazie per il vostro aiuto.
La variante 1 non funziona correttamente
La variante 2 funziona correttamente.
Anche la mia variante funziona correttamente, ma se gli ordini vengono riportati a un altro giorno o più, il valore non è chiaro Profit 190, mentre dovrebbe essere 4,27.
Vedere lo screenshot #3https://www.mql5.com/ru/forum/162930/page3
// Возвращает суммарный профит в валюте депозита серии закрытых ордеров |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
double LastProfit=0;
datetime t=0;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
if (OrderSymbol()!=Symbol()||OrderMagicNumber()!=magic) continue;
if (t<OrderCloseTime()) {t=OrderCloseTime();}
if ((op<0||OrderType()==op) && t==OrderCloseTime()) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
}
return(LastProfit);
}
Come si scopre, il problema non è il numero di ordini, ma il trasferimento degli ordini ad un altro giorno o più.
Quindi chiudete in una serie o cosa? Qual è il riporto se si chiudono tutti gli ordini in un ciclo?
Gli ordini vengono chiusi per serie, ma se non ci sono le condizioni per la chiusura, gli ordini vengono raccolti per un giorno o due, ecc.
Anche se il numero di ordini influisce anche sul valore del profitto.
Se ci sono più di 3 ordini, il valore viene calcolato solo per l'ultimo ordine chiuso.