Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 33
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
Bene. Puoi dirmi dov'è l'errore?
extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10; extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
}
Tutto funziona, fa un ordine al prezzo di maxpr1.
Poi voglio fare lo stesso, ma al prezzo minpr1:
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
}
Errore 130 (fermate sbagliate). Cosa sto facendo di sbagliato?
Quando piazzi un ordine pendente, il prezzo di apertura non può essere troppo vicino al mercato. La distanza minima del prezzo in sospeso dal prezzo corrente di mercato in punti può anche essere ottenuta usando la funzione MarketInfo() con il parametro MODE_STOPLEVEL. Se il prezzo aperto dell'ordine pendente non è corretto, verrà generato un errore 130 (ERR_INVALID_STOPS).
No, non è questo, il divario è lì. Inoltre, ho provato a cambiare il mio Buy pending, testato sullo stesso grafico, stessi errori.
Una lacuna è una lacuna, ma probabilmente non hai letto tutto ciò che segue
....... Se ilprezzo aperto dell' ordine pendente non è corretto, verrà generato l'errore 130 (ERR_INVALID_STOPS)...........
Cioè state cercando di impostare OP_SELLLIMIT al di sotto del prezzo di mercato.
Una lacuna è una lacuna, ma probabilmente non hai letto tutto quello che segue
....... Se ilprezzo aperto dell' ordine pendente non è corretto, verrà generato l'errore 130 (ERR_INVALID_STOPS)...........
Cioè state cercando di impostare OP_SELLLIMIT al di sotto del prezzo di mercato.
for(int i2=total-1; i2>=0; i2--)
if(OrderSelect(i2, SELECT_BY_POS))
if(OrderSymbol()==Symbol() )
if (OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY)
{
if (sig2==1) {bool cl = OrderClose(OrderTicket(),OrderLots(),Bid,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
}
if (OrderType()==OP_SELL)
{
if (sig2==2) {bool cl = OrderClose(OrderTicket(),OrderLots(),Ask,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
}
if (OrderType()==OP_BUYSTOP)
{
if (sig2==2&&Delete_Order==true) {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
//if (sig==1&&OrderOpenPrice()!=buystop_open&&Ask<buystop_open-stops) {bool mod = OrderModify(OrderTicket(),buystop_open,buystop_sl,0,0);Print("Мод. цены бай стоп=" ,buystop_open,", СЛ=",buystop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
}
if (OrderType()==OP_SELLSTOP)
{
if (sig2==1&&Delete_Order==true) {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
//if (sig==1&&OrderOpenPrice()!=sellstop_open&&Bid>sellstop_open+stops) {bool mod = OrderModify(OrderTicket(),sellstop_open,sellstop_sl,0,0);Print("Мод. цены бай стоп=" ,sellstop_open,", СЛ=",sellstop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
}
}
}
//+------------------------------------------------------------------+
if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // comprare stop
Non c'è nessun segnale per chiudere un trade aperto da solo.
if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // comprare stop
Non c'è nessun segnale per uscire da un trade da solo.
Alla barra zero il segnale "sfarfalla", il che non è visibile a posteriori. Esegui la visualizzazione su tutte le zecche nel tester, le domande scompariranno.
Non è questo il problema. Quando un ordine viene attivato, viene aperto un trade che viene immediatamente chiuso quando appare una nuova candela e non c'è un segnale di inversione. Ecco perché ti ho dato un pezzo di codice per chiudere i trade.
Salve.
Puoi dirmi cosa c'è che non va?
L'icona dovrebbe essere impostata se la linea dell'indicatore ha attraversato il livello 20, sul periodo M1, e la linea dell'indicatore è sopra il livello 50, sul periodo M5.
Per qualche ragione il marchio è impostato anche se la linea su M5 è sotto il livello impostato di 50.
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[])
{
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;
for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
{
UP[i]=Low[i]-distance*MyPoint;
}
//if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
//{
// DOWN[i]=High[i]+distance*MyPoint;
//}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
Salve.
Puoi dirmi cosa c'è che non va?
L'icona dovrebbe essere impostata se la linea dell'indicatore ha attraversato il livello 20, sul periodo M1, e la linea dell'indicatore è sopra il livello 50, sul periodo M5.
Per qualche motivo il segno è impostato anche se la linea su M5 è sotto il livello impostato di 50.
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[])
{
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;
for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
{
UP[i]=Low[i]-distance*MyPoint;
}
//if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
//{
// DOWN[i]=High[i]+distance*MyPoint;
//}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
Il tuo ciclo è strano. Strano.
if(rates_total<xxx) return(0); // xxx здесь - количество баров, при которых невозможно рассчитать индикатор
int limit=rates_total-prev_calculated;
if(limit>1) { // limit больше 1 в том случае, когда в истории произошли изменения
limit=rates_total-1; // не обязательно -1, если в цикле есть i+1, значит limit=rates_total-2, и т.д., и т.п.
// тут проводим действия когда нужно пересчитать всю историю
}
//---
for(int i=limit; i>=0; i--) {
// основной цикл индикатора
}
//+------------------------------------------------------------------+
Perché limitare il controllo per più di 1. Per esempio, la storia viene caricata e la differenza sarà maggiore di uno. Se tutto è normale, allora la differenza rates_total-prev_calculated sarà o 0 o 1
0 - un nuovo tick è arrivato e una nuova barra non ha iniziato a formarsi.
1 - un nuovo tick è arrivato e una nuova barra ha iniziato a formarsi
Mostraci tutto il tuo indicatore - vediamo cosa c'è di sbagliato.