Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 7

 
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.

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.3

 
Sergey Basov:

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.

Grazie per il chiarimento.

 
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:

//+------------------------------------------------------------------+
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);
   }
//+------------------------------------------------------------------+
 
void OnTick()
  {
//---
   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.
 
Artyom Trishkin:

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.
 
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.

 
strongflex:
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.