Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 7
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
Ciao, non ho trovato un thread sull'aggiornamento del terminale Metatrader 4 per Android 2.3, quindi per favore non cacciatemi troppo per aver postato in questo thread. Sul mercato terminale solo per Android 4+. Dove posso ottenere un aggiornamento, perché il mio ha smesso di funzionare.
Forum sul trading, sistemi di trading automatico e test di strategie di trading
Terminale mt5 e mt4 non funzionano
Renat Fatkhullin, 2016.11.13 23:51
Siamo spiacenti, non supportiamo più le versioni di Android inferiori alla 4.0.3Non ho niente da spiegare, quindi nessuno risponde. Il grafico che avete mostrato non ha senso ed è un mistero come sia stato ottenuto.
L'opzione "Superficie bidimensionale" nella scheda "Grafico di ottimizzazione" del tester ha senso (imho) quando abbiamo bisogno di ottimizzare 2 parametri di input dell'Expert Advisor, o vedere visivamente a quali valori di 2 parametri sulla storia sono stati buoni risultati, se questi parametri sono interdipendenti, e se hanno un senso.
Hai solo 0 su entrambi gli assi per qualche motivo, e verticalmente questi 0 sono divisi in 3 passi intermedi, quindi hai "cubi uno al centro, due più in basso/alto, e due/tre nello stesso quadrato". E i risultati sembrano casuali - "cubi" bianchi e verdi sparsi a caso. Quindi il grafico non ha senso e non sembra significare nulla.
Il grafico può non avere senso, ma dopo l'ottimizzazione nel periodo dal 2014-2015 e quando si selezionano e si impostano parametri migliori e si ri-testano dal 2014 ad oggi, il risultato di perdita / drawdown rimane invariato, bene, il profitto aumenta in proporzione al periodo. Inoltre, il bot stava lavorando su una demo per un mese, e durante i test dell'ultimo mese con i parametri di default tutte le offerte coincidono con il tester = +5pp. Quindi non giocherò con i cubi e il loro colore.
Grazie per il chiarimento.
Sto cercando di imparare MQL4 e quindi per favore non sentitevi in colpa per la mia domanda.
Per favore, come calcolare correttamente lo SL e il TP per un ordine pendente, nel caso in cui non sia piazzato sul prezzo corrente ma sul prezzo ottenuto durante i calcoli?
Dovrebbero essere calcolati in base alla lunghezza della candela. È all'incirca così:
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*Point,Digits);
Grazie!
Ciao!
Sto cercando di imparare MQL4, quindi per favore non sentitevi in colpa per la mia domanda.
Si prega di consigliare come calcolare correttamente SL e TP per un ordine pendente e se questo non viene piazzato al prezzo corrente ma al prezzo ottenuto durante i calcoli.
Dovrebbero essere calcolati in base alla lunghezza della candela. È all'incirca così:
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*Point,Digits);
Grazie!
Ecco le funzioni che calcoleranno gli ordini stop corretti per qualsiasi tipo di ordine:
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
return((lv==0)?sp*2:lv);
}
//+------------------------------------------------------------------+
{
//---
MqlDateTime server_time;
TimeToStruct(TimeCurrent(),server_time);
//--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
if(server_time.min%minutesBefore==0 || server_time.min==0) {
if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_BUY) {
//--- получили сигнал на покупку
Print("Сигнал на покупку ",TimeCurrent()); // Проверочное сообщение в журнал
//--- проверка наличия уже открытой позиции на покупку
if (OrdersTotal() == 0)
{
ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue);
Alert ("Есть сигнал на покупку ", sim, per);
}
if (OrdersTotal() >0)
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
if(OrderType()==OP_SELL)
{
OrderClose(ticket, OrderLots(), Bid,0,Blue);
{
ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue);
Alert ("Есть сигнал на закрытие продажи и открытие покупки ", sim, per);
}
}
//--- вызов функции открытия позиции на покупку
}
if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_SELL) {
//--- получили сигнал на продажу
Print("Сигнал на продажу ",TimeCurrent()); // Проверочное сообщение в журнал
//--- проверка наличия уже открытой позиции на продажу
if (OrdersTotal() == 0)
{
ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red);
Alert ("Есть сигнал на продажу ", sim, per);
}
if (OrdersTotal() >0)
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
if(OrderType()==OP_BUY)
{
OrderClose(ticket, OrderLots(), Ask,0,Red);
{
ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red);
Alert ("Есть сигнал на закрытие покупки и открытие продажи ", sim, per);
}
}
//--- вызов функции открытия позиции на продажу
}
}
}
Ecco le funzioni che calcoleranno gli ordini stop corretti per qualsiasi tipo di ordine:
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
return((lv==0)?sp*2:lv);
}
//+------------------------------------------------------------------+
Grazie, Artem, ci darò un'occhiata.
Non c'è di che. Ovunque abbiate bisogno di ottenere prezzi di stop accurati, conoscendo il prezzo aperto di un ordine a mercato o in sospeso, ottenete i prezzi richiesti con queste funzioni - esse restituiranno prezzi già calcolati per l'ordine di stop richiesto.
Supponiamo di avere il prezzo impostato di un ordine pendente:
double priseSet=1.12345;
Allora il prezzo di stop loss
int StopLoss=20; punti per BuyLimit sarà:
double sl=CorrectStopLoss(Symbol(),OP_BUYLIMIT,priceSet,StopLoss);
La variabile sl prenderà lo stop loss calcolato correttamente per BuyLimit con i requisiti StopLevel.
Ecco un consiglio. Supponiamo che venga aperta una posizione corta. In caso di segnale di acquisto chiudere lo short e aprire il long.
Controlla se c'è una posizione di vendita aperta. Se è così, chiudetelo.
Poi aprite una posizione di acquisto.
È elementare.
Ho un grande desiderio di usare mql4 per implementare un tale algoritmo:
Ci sono due terminali MT4 di diversi broker. In uno di essi c'è un indicatore "esclusivo", che non può essere spostato su un altro terminale (come nel Mercato).
E allora? È possibile prendere le letture dei buffer dell'indicatore "esclusivo" e implementarle nel proprio indicatore nel proprio terminale?
Le risorse non funzionano in qualche modo.