Ciao, non sono riuscito a trovare un thread sull'aggiornamento del terminale Metatrader 4 per Android 2.3, quindi per favore non prendetemi troppo a calci per aver postato in questo thread. Sul mercato il terminale è solo per Android 4+. Dove posso aggiornare, perché il mio ha smesso di funzionare.
k19alex69: 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.
Non 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.
Ciao! 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!
Viachaslau Baiko: 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:
voidOnTick() { //--- 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); } } //--- вызов функции открытия позиции на продажу } } }
Un consiglio. Ho bisogno di aprire uno short, per esempio. In caso di segnale di acquisto chiudere lo short e aprire il long.
Viachaslau Baiko: 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.
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?
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
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.