Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 39
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
Non so come spiegarlo. Ma è sicuramente un capolavoro.
Ti dico che a loro piace essere sarcastici qui ))) Anche Trishkin si è offeso e ha detto che il codice aiuterà.
Sono nuovo come te, ma anche io ho un sacco di domande
for(int i=0; i<OrdersTotal(); i++){
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() ||OrderMagicNumber()!=Magic) continua;
if(OrderType()==OP_BUY||OrderType()==OP_SELL) p++;
if(OrderType()==OP_BUYSTOP)
if(signal_bue)OrderDelete(OrderTicket());
else b++;
if(OrderType()==OP_SELLSTOP)
if(signal_sell)OrderDelete(OrderTicket());
else s++;
}
}
1) dove hai preso b++
2) dove hai presos++
3)if(signal_bue) è cos'altro?
E il resto del codice. Scusa se ti ho offeso.
//| ОТЛОЖКИ.mq4 |
//+------------------------------------------------------------------+
extern double StopLoss = 100; //Стоплосс ордера
extern double TakeProfit = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int Delta = 100; //Расстояние от цены для установки ордера
extern double LOT = 0.1; //Объём позиции
extern int Magic =2;
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if (TrailingStop!=0) Trailing();
//ИНДИКАТОР RSI
double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
int b = 0, s = 0, p = 0, res = 0;
double BuyPrice=Ask+Delta*Point;
double SellPrice=Bid-Delta*Point;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
if (OrderType()==OP_BUYSTOP)
{
if(RSI0<50&&RSI1>50)
OrderDelete(OrderTicket());
else
b++;
}
if (OrderType()==OP_SELLSTOP)
{
if(RSI0>50&&RSI1<50)
OrderDelete(OrderTicket());
else
s++;
}
}
}
double SL,TP; // < !!!!!!!!! эти переменные не используются, можно удалить
//---- buy stop
if(RSI0>50&&RSI1<50 && p<1 && b<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
}
//---- sell stop
if(RSI0<50&&RSI1>50 && p<1 && s<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
}
//----
return(0);
}
Ti dico che qui amano essere sarcastici). E Trishkin si è offeso e ha detto che mi avrebbe aiutato con il codice.
Così è più semplice:
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
OrderDelete(OrderTicket());
}
}
}
È da qualche parte al di fuori della funzione void OnTick().
if (сигнал_sell)OrderDelete_(OP_BUYSTOP);
E questo è nel corpo della funzione void OnTick().
E questo è nel corpo della funzione void OnTick()
Ok.
Più o meno ho finito quello che potevo. La descrizione è fatta. Lo scopo è quello di capire perché non funziona come vorrei.
C'è qualcos'altro all'interno del blocco if(). Era davvero previsto in questo modo?
Più in là. La funzione Counts() accetta una variabile globale non inizializzata count che, inoltre, è definita ancora una volta all'interno della funzione.
La funzione Counts() conta gli ordini ma li confronta con qualche biglietto che cambia più volte nella funzione principale. Ma il valore del biglietto è lo stesso durante il funzionamento della funzione. Quindi, quanti ordini calcolerà la funzione? È più di uno?
In questa forma, questa funzione non ha bisogno di argomenti, basta chiamarla e farle restituire il risultato.
Il prossimo. La funzione FindLastOType() è di nuovo un confronto con il biglietto. Può garantire che è confrontato con un biglietto valido? Non è più semplice interrompere il ciclo quando viene trovato il primo ordine con il numero magico e il simbolo necessari e poi restituire il tipo di ordine?
Lo stesso vale per FindLastOrderOpenPrice() e FindLastLot().
La funzione ModifyOrders() mi ha fatto inorridire così tanto che non la guarderei per molto tempo per dormire senza incubi...
Si prega di fare le correzioni nel codice
Prova ^_~
extern double TakeProfit = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int Delta = 100; //Расстояние от цены для установки ордера
extern double LOT = 0.1; //Объём позиции
extern int Magic =2;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int res = 0;
//ИНДИКАТОР RSI
double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
double BuyPrice=Ask+Delta*Point;
double SellPrice=Bid-Delta*Point;
//---- buy stop
if(RSI0>50&&RSI1<50 && Number(OP_BUYSTOP)<0 && Number(OP_BUY)<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
}
//---- sell stop
if(RSI0<50&&RSI1>50 && Number(OP_SELLSTOP)<0 && Number(OP_SELL)<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
}
//----
if (RSI0>50&&RSI1<50) OrderDelete_(OP_SELLSTOP);
if (RSI0<50&&RSI1>50)OrderDelete_(OP_BUYSTOP);
}
//+------------------------------------------------------------------+
void OrderDelete_(int Type)
{
bool r;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
r = OrderDelete(OrderTicket());
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Number(int Type)
{
int kp=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
kp++;
}
}
return(kp);
}
//+------------------------------------------------------------------+
C'è qualcos'altro all'interno del blocco if(). Era davvero destino che fosse così?
Più in là. La funzione Counts() accetta una variabile globale non inizializzata count che è anche dichiarata ancora una volta nella funzione stessa.
La funzione Counts() conta gli ordini ma li confronta con qualche biglietto che cambia più volte nella funzione principale. Ma il valore del biglietto è lo stesso durante il funzionamento della funzione. Quindi, quanti ordini calcolerà la funzione? È più di uno?
In questa forma, questa funzione non ha bisogno di argomenti, basta chiamarla e farle restituire il risultato.
Il prossimo. La funzione FindLastOType() è di nuovo un confronto con il biglietto. Può garantire che è confrontato con un biglietto valido? Non è più semplice interrompere il ciclo quando viene trovato il primo ordine con il numero magico e il simbolo necessari e poi restituire il tipo di ordine?
Lo stesso vale per FindLastOrderOpenPrice() e FindLastLot().
La funzione ModifyOrders() mi ha terrorizzato così tanto che non l'ho guardata per molto tempo per evitare incubi notturni...
Correzione
Non c'è altro modo di metterlo da nessun'altra parte, sarebbe un parametro sbagliato
Deve prendere in considerazione il più recente
Cercherò di cambiarlo.
Ho provato a usare OrderModify() standard, ma si blocca se muovo un mucchio di ordini simultaneamente e costantemente
Grazie per la critica.
Sì, la parentesi è sbagliata. Il resto della domanda è valido.
bool condition;
if(condition) {}
equivalente a
if(condition==true) {}
и
if(!condition) {}
è uguale a
if(condition==false) {}
È solo più breve e più familiare.