Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 623
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 già descritto il compito più semplice.
Aprire MetaEditor.
Cliccate su File->Create.
Nel campo a comparsa selezionare Indicatore.
...
Ma questo codice non è accettato dal traduttore MQL.
Risponderò tra circa 20 minuti
Cosa state facendo voi bambini, in realtà, a smuovere le acque?
Nessuno fa storie. La situazione comincia finalmente a schiarirsi un po'. Si scopre che si chiama script una funzione che non può essere messa nel corpo del codice principale.
Inoltre non dimenticate che MT è destinato a lavorare con denaro che deve essere protetto dagli attacchi di terzi. Da qui la maggior parte delle limitazioni della lingua.
Ho già descritto un compito semplice.
Aprire MetaEditor.
Cliccate su File->Create.
Nel campo a comparsa selezionare Indicatore.
Nell'indicatore OnCalculate() introduce qualsiasi oggetto script con l'evento OnStart().
Personalmente non so come fare. Beh, per esempio così:
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
for(int i = 1; i < 100;i++)
{
se(open[i] > Max)
{
OnStart()
E qui scriviamo uno script per costruire l'oggetto che ci interessa. Per esempio, un'ellisse o una lettera su un grafico o qualcos'altro
} //if(open)
} //for(int i)
//--- restituire il valore di prev_calculato per la prossima chiamata
return(rates_total)
} // OnCalculate
Dovrebbe avere un aspetto simile a questo.
Ma il traduttore MQL non percepisce tale codice.
Dovrebbe assomigliare a questo
Tra circa 20 minuti risponderò.
Ci è voluto molto tempo per caricare il video - oltre 40 minuti.
Ci è voluto molto tempo per caricare il video - più di 40 minuti.
A volte confondo anche le sezioni del forum e scrivo una risposta a una domanda su mql4 in mql5.
In linea di principio, in questo caso non cambierà nulla tranne l'estensione del file, ma in mql4 sarà superfluo
e anche completamente inutile e superfluo.
Cosa state facendo voi bambini, in realtà, a smuovere le acque?
Basta andare nel MetaEditor e digitare il comando: File->Creare...
Questo farà apparire un modulo con diversi file fittizi.
In particolare, questi saranno i dongle:
- Consulente esperto
- Indicatore personalizzato
- Script
- Biblioteca, ecc.
Siamo interessati ai primi tre elementi: Expert Advisor, Custom Indicator e Script.
Confrontiamo questi manichini:
In Expert Advisor abbiamo degli eventi:
-OnInit(), OnDeinit(), OnTick(), OnTimer, OnChartEvent() ... tutto, niente più.
Nello script abbiamo gli eventi:
- OnStart() ... questo è tutto, niente di più.
nell'indicatore abbiamo degli eventi:
- OnInit(), OnCalculate(), OnTimer, OnChartEvent() ... tutto, niente più.
La domanda naturale qui è come fare il collegamento tra questi oggetti.
Si scopre che non c'è e non può esserci alcuna connessione tra loro in MQL, perché i flussi di dati tra questi oggetti sono completamente separati e non c'è alcuna connessione tra loro.
Inoltre, sono sorpreso dal fatto che i creatori di MQL ci danno questo fatto come un "bene".
E se, per esempio, in C++ posso facilmente chiamare il traduttore BASIC, o Javascript o qualsiasi altro traduttore, e andare nell'ambiente di programmazione Android, per esempio,
in MQL, non posso nemmeno creare un cosiddetto "script" nell'ambiente "indicatore", perché l'ambiente indicatore non accetta il comando OnStart().
Che razza di mostro è questo?
E ce ne sono più che a sufficienza di queste cose brutte in MQL.
Sono ad ogni passo.
Ho letto la descrizione di MQL - e sono sorpreso, perché non c'è altro da fare.
Per tutto il tempo i creatori di MQL proclamano a gran voce che MQL è un discendente di C++.
Certo, mi dispiace, ma voglio chiedere ai creatori di MQL: - Erede di cosa? - Nella sua bruttezza?
Paragono involontariamente MQL al famoso ambiente di programmazione 1C. Sostengono anche di essere gli eredi di C++.
Ma lì tutto è fatto in modo molto più decente.
E gli oggetti grafici, e la comunicazione tra i moduli e molto altro.
E cosa c'è in MQL?
Nessuna classe incorporata, nessun oggetto legato ai thread... e niente di niente.
E non ho detto nulla sul guscio matematico del terminale!!!
Questo è un argomento a parte per le sorprese!!!
Perché non leggi un po' di Aiuto e trovi tutte quelle cose che dici di non avere, leggi delle classi integrate in SB, impara a chiedere aiuto educatamente (hai chiesto aiuto) e impara a non essere scortese con le persone che cercano di aiutarti (nota che sono disinteressate)...
In generale - bannarti per 24 ore per trolling, maleducazione e accattonaggio (non hai mostrato una riga del tuo codice per dimostrare tutte le tue affermazioni, ma impudentemente richiedi alle persone che hanno risposto alla tua domanda e alle tue affermazioni, che ti forniscano codice funzionante per le tue esigenze - non è usuale qui - aiutano, non fanno per te, nota - il codice più semplice)
Senza offesa - chi viene da noi con niente sarà ucciso da qualcosa di incomprensibile.
Tanto più che ti ho avvertito di abbassare il riscaldamento:
Forum sul trading, sistemi di trading automatico e test di strategie di trading
Tutte le domande dei principianti su MQL4, aiuto e discussione su algoritmi e codici
Artyom Trishkin, 2018.09.12 14:02
Ora prova senza gli insulti e l'arroganza.come installare mt4 su macOS? aiuto per favore!
Esclusivamente in una macchina virtuale. Ho Parallel's, costoso ma conveniente e affidabile.
https://www.parallels.com/ru/products/desktop/
Sto chiedendo aiuto. Le domande sono:
1. Il programma non imposta gli stop loss sia in acquisto che in vendita in modalità test. Ma la modifica degli ordini in sospeso va bene.
2. Non parte in tempo reale sul conto.
Per favore, aiuto.
Vorrei anche chiedere di segnalare eventuali errori che possono essersi verificati durante la scrittura del programma.
Molte grazie in anticipo.
Codice del programma:
.input int Percent=50;
input int MAGICNUMBER=413;
//Introduzione di costanti e oscillatori di indicatori per i grafici a lungo termine
ingresso int Signal_Period_long_term=6;
input int Fast_EMA_Period_long_term=12;
input int Slow_EMA_Period_long_term=24;
//Impatto dei parametri degli indicatori e delle costanti degli oscillatori per i grafici a breve termine
input int Stochastic_Kperiod_short_term=5;
input int Stochastic_Dperiod_short_term=3;
input int Stochastic_slowing_short_term=3;
input ENUM_TIMEFRAMES PERIODs_short_term=PERIOD_M5;
input ENUM_TIMEFRAMES PERIODs_long_term=PERIOD_H1;
//-----------------------------------------------------------------------------------------
//variabili comuni e i loro tipi
static datetime New_Time;//ora della barra corrente
statico datetime Time_Local;
double Margin_Percent; //Utilizzato per l'apertura di ordini
double Lots;//Determinazione del numero totale di lotti
doppio Lotti_Volume;
/Variabili e tipi per il grafico a lungo termine
double MacdCurrent_long_term;//MACD parametri della linea principale della barra corrente
double MacdPrevious_long_term;//MACD parametri della linea principale della barra precedente
doppio SignalCurrent_long_term;
/Variabili e tipi per il grafico a breve termine
double Stochastic_Current_short_term_main;//Parametri stocastici della barra corrente sul grafico a 5 minuti
double Stochastic_Previous_short_term_main;//Parametri stocastici della barra precedente sul grafico a 5 minuti
double Stochastic_Current_short_term_signal;//Parametri stocastici della barra corrente nel grafico a 5 minuti
double Stochastic_Previous_short_term_signal;//Parametri stocastici della barra precedente sul grafico a 5 minuti
doppio StopLoss_BUY;
doppio StopLoss_SELL;
doppio Price_BUY;
doppio Price_SELL;
//+------------------------------------------------------------------+
//| 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()
{
int biglietto,cnt;
int total=OrdersTotal();// Determinazione del numero di ordini
bool New_Bar=false; // Flag nuova barra
//Definizione dei valori delle variabili per il grafico a lungo termine
MacdCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,1);
MacdPrevious_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,2);
SignalCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_SIGNAL,1);
//Determinazione dei valori delle variabili per il grafico a breve termine
Stochastic_Current_short_term_main=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,1);
Stochastic_Previous_short_term_main=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,2);
Stochastic_Current_short_term_signal=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,1);
Stochastic_Previous_short_term_signal=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,2);
//Definizione delle variabili comuni
Price_BUY=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
Price_SELL=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
StopLoss_BUY=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
StopLoss_SELL=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
Margin_Percent=AccountFreeMargin()*Percent/100;
Lotti=NormalizeDouble(Margin_Percent/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);
Lots_Volume=NormalizeDouble(MathFloor(Lots)+MarketInfo(Symbol(),MODE_LOTSTEP),2);
//-----------------------------------------------------------------------------------------------------------------------
//----- Определение нового бара------------------------------------------------------------------------------------------
New_Time=TimeCurrent();
Print("Time=",TimeCurrent();
Print("Bar open time =",iTime(NULL,PERIODs_short_term,0));
if(iTime(NULL,PERIODs_short_term,0)==New_Time) // Confronta i tempi
{
if(iVolume(NULL,PERIODs_short_term,0)<=2) //compara il volume
Stampa("Volume della barra =",Volume[0]);
if(iBarShift(NULL,PERIODs_short_term,TimeCurrent())==0)//Controlla l'indice della barra
Print("Bar index =",iBarShift(NULL,PERIODs_short_term,TimeCurrent());
New_Bar=true; // Viene catturata una nuova barra
Stampa("New_Bar");
}
else if(New_Bar==false) // Se la barra non è nuova...
{
Stampa("La barra non è nuova");
ritorno;
}
//---Controllare la disponibilità di fondi per l'apertura del lotto minimo
if(Margin_Percent<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT))
{
Print("Non ci sono abbastanza fondi. Fondi liberi = ",AccountFreeMargin());
ritorno;
}
//---Determinazione del numero dei lotti
se(Lotti>Lotti_Volume)
{
Lots=NormalizeDouble(Lots_Volume,2);
Stampa("Numero di lotti: ",Lotti);
}
else if(Lotti<Lotti_Volume)
{
Lots=NormalizeDouble(MathFloor(Lots),2);
Stampa("Numero di lotti: ",Lotti);
}
//+------------------------------------------------------------------+
//| Condizioni di apertura degli ordini se il numero di ordini è uguale a zero |
//+------------------------------------------------------------------+
se(totale<1)
{
if(MacdCurrent_long_term<0 && MacdCurrent_long_term>SignalCurrent_long_term)
Print("Condition is true for BUY");
{
//+---------------------------------------------------------------------------+
//| Condizione per aprire una posizione long BUY solo
//+---------------------------------------------------------------------------+
if(Stochastic_Current_short_term_main<Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main>=Stochastic_Previous_short_term_signal)
{
ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price_BUY,3,0,0,NULL,MAGICNUMBER,0,Blue);
if(ticket>0)//controlla la posizione aperta
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Print("BUY order open : ",OrderOpenPrice());
ritorno;
}
else Print("BUY order open error : ",GetLastError());
ritorno;
}
}
}
if(MacdCurrent_long_term>0 && MacdCurrent_long_term<SignalCurrent_long_term)
Print("La condizione è vera per SELL");
{
//+---------------------------------------------------------------------------+
//| Condizione per l'apertura di posizioni short SELL solo
//+---------------------------------------------------------------------------+
if(Stochastic_Current_short_term_main>Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main<=Stochastic_Previous_short_term_signal)
{
ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Price_SELL,3,0,0,NULL,MAGICNUMBER,0,Green);
if(ticket>0)//controlla la posizione aperta
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Print("SELL order open : ",OrderOpenPrice());
ritorno;
}
else Print("Error opening SELL order : ",GetLastError());
ritorno;
}
}
}
}
//+---------------------------------------------------------------------------+
//| Condizioni di modifica dell'ordine
//+---------------------------------------------------------------------------+
for(cnt=0;cnt<totale;cnt++)
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continuare;
if(OrderMagicNumber()==MAGICNUMBER && // controlla il numero magico dell'ordine
OrderSymbol()==Symbol()) // controlla il simbolo dell'ordine
{
//--- posizione lunga aperta
se(OrderType()==OP_BUYSTOP)
{
if(OrderOpenPrice()<Price_BUY && Ask<Price_BUY)
{
if(OrderModify(OrderTicket(),Price_BUY,0,0,0,0,Blue))
Print("L'ordine Price_BUY è stato modificato con successo");
else Print("Errore nella modifica dell'ordine BUYStop. Codice di errore=",GetLastError());
ritorno;
}
else Print("Il prezzo di modifica è superiore al prezzo dell'ordine");
ritorno;
}
se(OrderType()==OP_SELLSTOP)
{
if(OrderOpenPrice()<Price_SELL && Bid>Price_SELL)
{
if(OrderModify(OrderTicket(),Price_SELL,0,0,0,Green))
Print("L'ordine Price_SELL è stato modificato con successo");
else Print("Errore nella modifica dell'ordine SELLStop. Codice di errore=",GetLastError();
ritorno;
}
}
if(OrderType()==OP_BUY)
{
if(OrderStopLoss()<StopLoss_BUY && StopLoss_BUY<Ask)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_BUY,0,0,Blue))
Print("Price_BUY order price successfully modified.");
else Print("Errore nella modifica dell'ordine BUY. Codice di errore=",GetLastError());
ritorno;
}
}
if(OrderType()==OP_SELL)
{
if(OrderStopLoss()>StopLoss_SELL && StopLoss_SELL>Bid)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))
Print("Price_SELL order price successfully modified.");
else Print("Errore nella modifica dell'ordine SELL. Codice di errore=",GetLastError();
ritorno;
}
}
}
}
}
//+------------------------------------------------------------------+
Aiuta a risolvere un bug nell'indicatore, non disegna il massimo e il minimo del giorno quando è sull'ultima candela dell'ora.
https://prnt.sc/kut6xo
https://prnt.sc/kut79b
Sto chiedendo aiuto. Le domande sono:
1. Il programma non imposta gli stop loss sia in acquisto che in vendita in modalità test. Ma la modifica degli ordini in sospeso va bene.
2. Non parte in tempo reale sul conto.
Questo è il modo in cui
modificherà il codice AND, inserendolo correttamente (Alt+S).