Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 122
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
Ho deciso di aggiungere alla domanda precedente.
1)
Supponiamo che io abbia un segnale - quando lo spread si allarga bruscamente (sulle notizie)
Chiudere tutte le operazioni in corso
Ma gli ordini non si chiuderanno o apriranno solo durante le notizie.
Quindi, se prendiamo un comando, diciamo OrderClose, lo mettiamo in un ciclo + Sleep (3000) e lo eseguiamo finché non si chiude
2)
Se leghiamo una variabile interna al pulsante e assegniamo il valore premuto/chiuso alla possibilità di apertura dell'ordine, funzionerà in tempo reale?
Ho deciso di aggiungere alla domanda precedente.
1)
Supponiamo che io abbia un segnale - quando lo spread si allarga bruscamente (sulle notizie)
Chiudere tutte le operazioni in corso
Ma gli ordini non si chiudono o si aprono solo durante le notizie.
Quindi, se prendiamo un comando, diciamo OrderClose, lo mettiamo in un ciclo + Sleep (3000) e lo eseguiamo finché non si chiude
2)
Se leghiamo una variabile interna al pulsante e assegniamo il valore premuto/chiuso alla possibilità di apertura dell'ordine, funzionerà in tempo reale?
Saluti, sto scrivendo un indicatore che disegna lastoria degli ordini su un grafico, codice:
//| history.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
extern int MagicNumber = 1110;
extern datetime HistoryOrdersFromDateTime = 0;
extern color SellColor = clrRed;
extern color BuyColor = clrBlue;
extern color ProfitColor = clrWhite;
extern bool DeleteHistoryOrders = false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
void start()
{
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
{
if(HistoryOrdersFromDateTime<OrderCloseTime())
{
if((TimeCurrent()-OrderCloseTime())>60)
HistoryOrders();
}
}
}
}
void HistoryOrders()
{
double b=OrderOpenPrice(), d=OrderClosePrice(), lots=OrderLots(), Profit=0;
datetime a=OrderOpenTime(), c=OrderCloseTime(), close_time;
string Ticket=(string)OrderTicket(), type="Sell", symbol=OrderSymbol(), comment=OrderComment(), Background;
color col=SellColor;
if(OrderType()==0) {col=BuyColor; type="Buy";}
if(DeleteHistoryOrders==false)
{
//Начальная точка
ObjectCreate("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJ_ARROW,0,a,b);
ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJPROP_COLOR,col);
ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJPROP_ARROWCODE,1);
//Линия
ObjectCreate("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJ_TREND,0,a,b,c,d);
ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_COLOR,col);
ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_WIDTH,1);
ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_STYLE,STYLE_DOT);
ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_RAY,0);
//Конечная точка
ObjectCreate("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJ_ARROW,0,c,d);
ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJPROP_COLOR,col);
ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJPROP_ARROWCODE,3);
//Расчет профита
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
{
close_time=OrderCloseTime();
//60 секунд разницы между закрытием первого и последнего ордера в сетке
if(c<=close_time+60 && c>=close_time-60)
{
Profit+=OrderProfit()+OrderCommission()+OrderSwap();
Ticket=(string)OrderTicket();
}
}
}
//Размер фона
for(int i=2; i<StringLen(DoubleToString(Profit,2)); i++)
StringAdd(Background,"g");
//Фон профита
ObjectCreate("#"+Ticket+" Background",OBJ_TEXT,0,c,d);
ObjectSet("#"+Ticket+" Background",OBJPROP_ANCHOR,ANCHOR_LOWER);
ObjectSetText("#"+Ticket+" Background",Background,10,"Webdings",col);
ObjectSet("#"+Ticket+" Background",OBJPROP_PRICE1,d);
ObjectSet("#"+Ticket+" Background",OBJPROP_TIME1,c+Period());
//Профит
ObjectCreate("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJ_TEXT,0,c,d);
ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_ANCHOR,ANCHOR_LOWER);
ObjectSetText("#"+Ticket+" Profit: "+DoubleToString(Profit,2),DoubleToString(Profit,2),10,"Arial",ProfitColor);
ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_PRICE1,d);
ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_TIME1,c+Period());
} else ObjectsDeleteAll(0, "#"+Ticket+" ");
}
void OnDeinit(const int reason)
{
//Удалаение истории ордеров
for(int i=0; i<OrdersHistoryTotal(); i++)
{
DeleteHistoryOrders=true;
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
HistoryOrders();
}
}
L'indicatore disegna correttamente i singoli trade (linea>sfondo>profitto), ma c'è un piccolo "bug" nella visualizzazione dei set di ordini chiusi (screenshot allegato), le linee si sovrappongono allo sfondo e al profitto (linea(1)>sfondo>profitto>linea(2)>linea(3)>linea(4) .. . . .).
Dovrebbe essere così: (linea(1)> linea(2)> linea(3)> linea(4) . . . >fon>profitto). Varie manomissioni non hanno avuto successo, per favore aiutate a perfezionare.
Saluti, sto scrivendo un indicatore che visualizza lacronologia degli ordini su un grafico,
L'indicatore rende correttamente una singola operazione (linea>sfondo>profitto), ma nella visualizzazione di un insieme di ordini chiusi c'è un piccolo "shoosh" (allego uno screenshot), le linee (linea(1)>sfondo>profitto> linea(2)> linea(3)> linea(4) ... . ).
Dovrebbe essere così: (linea(1)> linea(2)> linea(3)> linea(4) . . . >fon>profitto). Varie manomissioni non hanno avuto successo, per favore aiutate a perfezionare.
Prova ad assegnare la proprietà OBJPROP_BACK alle linee e alle icone sullo sfondo.
Non è un'opzione, quindi le linee sono nello sfondo (dietro i candelieri), e il disegno dovrebbe essere sopra i candelieri: candelieri>linee>profitto>profitto sfondo
A proposito, questo eliminerà un ciclo aggiuntivo per il calcolo dei profitti.
Puoi fare questo
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
{
close_time=OrderCloseTime();
//60 секунд разницы между закрытием первого и последнего ордера в сетке
if(c<=close_time+60 && c>=close_time-60)
{
Profit+=OrderProfit()+OrderCommission()+OrderSwap();
Ticket=(string)OrderTicket();
}
}
}
ps Per favore. Inserisci un'immagine con questo pulsante
Poi solo la sequenza di disegno sul grafico. Oppure, quando si disegnano sfondo e profitto, dovremmo controllare la disponibilità di questi oggetti per tempo, leggere il valore del profitto nell'oggetto OBJ_TEXT e aggiungerlo al profitto dell'ordine corrente. Poi dovremmo cancellare lo sfondo e il profitto e disegnarli di nuovo.
A proposito, questo eliminerà la necessità di un ciclo aggiuntivo per il calcolo del profitto.
Si definisce il profitto all'inizio insieme a tutti gli altri parametri dell'ordine.
Come posso impostare questa sequenza di disegno, per esempio, prima disegnare tutti i punti e le linee che li collegano, e poi procedere a disegnare lo sfondo e il profitto?
Come faccio a impostare questa sequenza di disegno, diciamo, prima disegnare tutti i punti e le linee che li collegano, e poi procedere a disegnare lo sfondo e il profitto?
È meglio considerare questa variante.
ObjectFind() poi se l'oggetto è trovato ObjectGetString() lo converte da testo a numero, aggiunge il profitto dell'ultimo ordine al valore ottenuto, cancella l'OBJ_TEXT obsoleto e ne disegna uno nuovo.
Se è il primo o l'unico ordine chiuso in questa barra, disegniamo semplicemente OBJ_TEXT ed è tutto.
Per facilitare le cose, dovremmo specificare l'ora di apertura del bar invece del biglietto. O il biglietto è necessario per un ulteriore lavoro?
Beh, se è la mia prima ipotesi, è così. E poi ho avuto subito un pensiero improvviso e non ho cancellato la prima frase, ma mi piace di più la seconda.
È meglio considerare questa variante.
ObjectFind() poi se l'oggetto è trovato ObjectGetString() lo converte da testo a numero, aggiunge il profitto dell'ultimo ordine al valore ottenuto, cancella l'OBJ_TEXT obsoleto e ne disegna uno nuovo.
Se è il primo o l'unico ordine chiuso in questa barra, disegniamo semplicemente OBJ_TEXT ed è tutto.
Per facilitare le cose, dovremmo specificare l'ora di apertura del bar invece del biglietto. O il biglietto è necessario per un ulteriore lavoro?
Sì, il biglietto è necessario per l'analisi successiva della storia. Grazie per il consiglio di ridisegnare. Ho risolto il problema un po' più facilmente aggiungendo questo controllo e ridisegnando il codice:
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
{
close_time=OrderCloseTime();
//60 секунд разницы между закрытием первого и последнего ордера в сетке
if(c<=close_time+60 && c>=close_time-60)
{
Profit+=OrderProfit()+OrderCommission()+OrderSwap();
ProfitTicket=(string)OrderTicket();
CountOrders++;
}
}
}
//Перерисовка фона и профита
if(CountOrders>1)
{
ObjectDelete("#"+Ticket+" Background");
ObjectDelete("#"+Ticket+" Profit: "+DoubleToString(Profit,2));
Ticket=ProfitTicket;
}
Non so se è corretto, ma in linea di principio disegna come dovrebbe essere (linee>fon>profitto):
Sì, il biglietto è necessario per analizzare la storia in seguito. Ho risolto il problema un po' più facilmente aggiungendo un tale controllo e ridisegno al codice:
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
{
close_time=OrderCloseTime();
//60 секунд разницы между закрытием первого и последнего ордера в сетке
if(c<=close_time+60 && c>=close_time-60)
{
Profit+=OrderProfit()+OrderCommission()+OrderSwap();
ProfitTicket=(string)OrderTicket();
CountOrders++;
}
}
}
//Перерисовка фона и профита
if(CountOrders>1)
{
ObjectDelete("#"+Ticket+" Background");
ObjectDelete("#"+Ticket+" Profit: "+DoubleToString(Profit,2));
Ticket=ProfitTicket;
}
Fondamentalmente disegna correttamente (linee>sfondo>profitto):