Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 1100
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
Cari programmatori, potete per favore aiutarmi a impostare un divieto di aprire più di una serie di operazioni contemporaneamente (serie è se l'ordine viene chiuso in perdita o a zero e poi apre l'operazione successiva sullo stesso strumento, ma con un lotto più grande), cioè, se si apre una serie di operazioni la seconda e le successive vengono messe su altri strumenti sotto divieto (il bot lavora contemporaneamente su diversi strumenti). Penso che dovrebbe essere fatto attraverso una variabile globale nel terminale, ma non ho abbastanza conoscenza ed esperienza, ho appena iniziato a imparareMQL. Questo è un consulente di opzioni binarie. Ecco il codice
extern double Lots = 1; // Lots
extern int Exp = 1; // Scadenza
extern int Wait = 1; // Numero di candele di una direzione
extern int Timeout = 1; // intervallo di tempo
extern double Multiplier = 3; // Moltiplicatore
extern int Slippage = 5; // Slippage
extern int Magic = 2090; // Magic
biglietto int, Tipo;
doppio prezzo, lotto;
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'esperto |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Funzione di deinizializzazione dell'esperto |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| funzione tick esperto |
//+------------------------------------------------------------------+
void OnTick()
{
// --------------- Aprire le transazioni ---------------
if (OrdersTotal() == 0) // Il numero di ordini deve essere uguale a zero
{
se ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))
// Se l'ultimo trade è perdente, si apre lo stesso, ma con un lotto più grande
{
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
se (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)
// se il profitto dell'ultimo trade è uguale a zero, lo stesso trade sarà aperto
{
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder(), 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
se (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))
|| CountHistTrades() == 0)// Se l'ultimo trade è redditizio, l'ordine viene aperto
{
if (SignalBuy() && OrdersTotal() == 0)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (SignalSell() && OrdersTotal() == 0)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
Comment ("PriceCloseLastHistOrder(OP_BUY)= ", PriceCloseLastHistOrder(OP_BUY), "PriceCloseLastHistOrder(OP_SELL)=",
PriceCloseLastHistOrder(OP_SELL) );
}
}
}
}
//+------------------------------------------------------------------+
int CountTrades(int type = -1) // Determina il numero di scambi
{
int cnt = 0;
for (int i=OrdersTotal()-1; i>=0; i--) // Il ciclo passa assolutamente attraverso tutti gli ordini aperti, i è il numero dell'ordine
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // La funzione controlla se l'ordine con il numero d'ordine i è nel mercato,
// se c'è, vengono controllate le seguenti condizioni...
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)) // Se il simbolo
// il simbolo in cui l'ordine è aperto è uguale al simbolo corrente, il tipo di ordine è uguale a magico nelle impostazioni dell'EA corrente, e
// il tipo di ordine è uguale a type (o type == -1 (nel caso in cui non sia importante quale tipo è richiesto per il conteggio dell'ordine))
cnt++; // 1 viene aggiunto alla variabile cnt e alla fine del ciclo cnt sarà uguale al numero di accordi
// aperto dall'EA corrente per la coppia di valute corrente con un certo tipo
}
}
return(cnt); // viene restituito il valore della variabile cnt
}
//+------------------------------------------------------------------+
int CountHistTrades(int type = -1)
{
int cnt = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
cnt++;
}
}
ritorno(cnt);
}
//+------------------------------------------------------------------+
bool SignalBuy()
{
per (int i=1; i<=Attesa; i++)
{
se (Close[i] > Open[i]) return(false)
}
se ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))
&& CountHistTrades() > 0) return(true);
se (CountHistTrades() == 0) return(true);
return(false);
}
//+------------------------------------------------------------------+
bool SignalSell()
{
per (int i=1; i<=Attesa; i++)
{
se (Close[i] < Open[i]) return(false)
}
se ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))
&& CountHistTrades() > 0) return(true);
se (CountHistTrades() == 0) return(true);
return(false);
}
//+------------------------------------------------------------------+
datetime TimeLastHistOrder(int type = -1)
{
datetime lasttime = 0;
datetime opentime = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
se (OrderCloseTime() > lasttime)
{
lasttime = OrderCloseTime();
opentime = OrderOpenTime();
}
}
}
}
ritorno(opentime);
}
//+------------------------------------------------------------------+
int TypeLastHistOrder()
{
datetime time = 0;
int type = -1;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
se (OrderCloseTime() > time)
{
time = OrderCloseTime();
tipo = OrderType();
}
}
}
}
ritorno(tipo);
}
//+------------------------------------------------------------------+
double LotsLastHistOrder(int type = -1)
{
datetime time = 0;
doppio lotti = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
se (OrderOpenTime() > time)
{
time = OrderOpenTime();
tempo = OrderLots();
}
}
}
}
return(lots);
}
//+------------------------------------------------------------------+
doppio PriceCloseLastHistOrder(int type = -1)
{
datetime time = 0;
doppio prezzo = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
se (OrderCloseTime() > time)
{
time = OrderCloseTime();
prezzo = OrderClosePrice();
}
}
}
}
}
}
//+------------------------------------------------------------------+
doppio PriceOpenLastHistOrder(int type = -1)
{
datetime time = 0;
doppio prezzo = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
se (OrderCloseTime() > time)
{
time = OrderCloseTime();
prezzo = OrderOpenPrice();
}
}
}
}
}
}
//+------------------------------------------------------------------+
Houna domanda durante la programmazione: c'è un modo per ottenere il tempo del server preciso al millisecondo nell'EA?
Per esempio, ottenere: 23.09.2016 14h. : 53 min. 54000 millisecondi? Cioè esattamente 54 secondi, 000 millisecondi.
Ciao colleghi!
Houna domanda durante la programmazione: è possibile ottenere in qualche modo nell'Expert Advisor il tempo del server con una precisione di millisecondi?
Per esempio, ottenere: 23.09.2016 14h. : 53 min. 54000 millisecondi? Cioè esattamente 54 secondi, 000 millisecondi.
Domanda interessante. Cosa intendi per specificare l'ultimo tempo noto del server, il tempo dell'ultima citazione di TimeCurrent() o il tempo corrente sul server?
Se è TimeCurrent(), a cosa servirà, se consideriamo che un pacchetto con una nuova quotazione passa attraverso internet dal server al terminale per 10-500 ms e questo tempo varia da pacchetto a pacchetto. Inoltre, non è chiaro quale sia l'arrivo dell'ultima quotazione, se arriva al server da diverse fonti, fornitori di liquidità, e poi viene elaborata, e quindi il server invia un nuovo tick. Inoltre, non si sa come il timer di sistema del server sia sincronizzato con il tempo astronomico. Il 09.01.2014 dalle 04:15 alle 06:15 MSK (giovedì, giorno di trading) stavo scoprendo questo, come la deviazione non è da astronomico, ma dalla media per 31 aziende. La figura per 25 punti di tempo mostra queste deviazioni (in secondi, non in ms):
E che senso ha capire qualcosa in millisecondi dai dati del server?
La seconda opzione è più chiara. Se il tuo computer è sincronizzato con l'ora astronomica con una precisione che conosci, l'ora astronomica della città in cui il server è in funzione è conosciuta con la stessa precisione. Ma perché ne hai bisogno...
Non riesco a capire dove sia andata l'ottimizzazione del tester di strategia. I controlli sono tutti in piedi non riesco a capire nulla. MT4 build 1010. Windows 8.1.
Si prega di consigliare come abilitare l'ottimizzazione.
Allegherò degli screenshot. Non riesco a vedere il pulsante di ottimizzazione.
}
Chiedo ai programmatori competenti di spiegarmi qual è il mio errore! Perché l'ordine non viene modificato!!! e il compilatore non dà errori mentre lo fa
Ho studiato il tutorial, ho letto e preso appunti, potresti indicare gli errori nello specifico... perché il compilatore non dà nessun errore e non ci sono errori nel tester, ma l'ordine non è modificato, è come se l'ordine non si vedesse affatto nel programma
Leggete attentamente cosa restituisce OrderSend()
In realtà, io farei quanto segue:
Leggete attentamente cosa restituisce OrderSend()
Infatti, io farei così: