Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 31
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
L'errore è da qualche parte più in alto nel codice, nell'area di selezione degli ordini.
Non tocco il resto.
In ogni caso avete bisogno di vedere il codice precedente e seguente, non solo le linee di condizione.
...
Non puoi pulire il codice e incollarlo correttamente con l'SRC, vero?
Perché non applicate OrderSelect prima di provare a cancellare?
...
Non so perché hai bisogno di così tanti cicli, quando puoi riempire i campi della struttura richiesta sul numero di ordini e posizioni in uno solo.
Ho rimosso le cose inutili, e ho anche rimosso la cancellazione. Non hai bisogno di cancellare per biglietto (hai ancora bisogno di saperlo prima di cancellare), ma nel ciclo per trovare l'ordine giusto per indice, e cancellarlo.
Quindi, abbiamo bisogno di un'altra funzione per cercare e cancellare gli ordini, che dovrebbe essere chiamata in caso di condizione, ma che tipo di condizione - non l'ho capito subito guardando il tuo codice, e non ho avuto il tempo di esaminarlo. Descrivete a parole le condizioni necessarie e vi diremo come cancellare.
L'ho scritto da solo, senza guardare, quindi ci possono essere errori nella funzione che riempie la struttura con il numero di ordini e posizioni - non l'ho controllata.
input double LotB=0.1; // Лот Buy
input double LotS=0.1; // Лот Sell
input int Pointsl=100; // StopLoss в пунктах
input int Pointtp=100; // TakeProfit в пунктах
input int NumBars=10; // Количество баров для поиска Max/Min
input int Magic=100500; // Magic
//--- global variables
struct DataNumOrders
{
int buy; // Количество позиций Buy
int sell; // Количество позиций Sell
int buy_limit; // Количество ордеров BuyLimit
int buy_stop; // Количество ордеров BuyStop
int sell_limit; // Количество ордеров SellLimit
int sell_stop; // Количество ордеров SellStop
};
DataNumOrders numOrders; // Количество ордеров
double lotB, lotS;
int pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
numBars=(NumBars<1?1:NumBars>Bars?Bars:NumBars);
pointsl=(Pointsl<0?0:Pointsl);
pointtp=(Pointtp<0?0:Pointtp);
double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- заполним структуру количеством ордеров и позиций
GetNumOrders(Symbol(),Magic,numOrders);
//--- найдём максимальную и минимальную цены за bars свечей
double maxPrice=0.0; double minPrice=DBL_MAX;
for(int i=0; i<numBars; i++) {
double max_i=iHigh(Symbol(),PERIOD_CURRENT,i);
if(max_i>maxPrice) maxPrice=max_i;
double min_i=iLow(Symbol(),PERIOD_CURRENT,i);
if(min_i<minPrice) minPrice=min_i;
}
//--- выставим BuyLimit
if(numOrders.buy_limit==0 && numOrders.buy==0) {
double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
if(ticketUP==-1) Print("ERROR OP_BUY");
else Print("OP_BUY OK");
}
//--- выставим SellLimit
if(numOrders.buy_limit==0 && numOrders.sell==0) {
double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
if(ticketD==-1) Print("ERROR OP_SELL");
else Print("OP_SELL OK");
}
//--- Тут должно быть удаление, но не понятно при каких условиях. Опишите их
//---
string a=(numBars==1)?"bar: ":IntegerToString(numBars,1)+" bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxPrice, Digits()), ", min ", DoubleToStr(minPrice, Digits()),".");
}
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров |
//+------------------------------------------------------------------+
void GetNumOrders(string symbol_name, int magic_number, DataNumOrders &number_of) {
ZeroMemory(number_of);
for(int i=OrdersTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS)) {
if(OrderMagicNumber()!=magic_number) continue;
if(OrderSymbol()!=symbol_name) continue;
if(OrderType()==OP_BUY) number_of.buy++;
if(OrderType()==OP_BUYLIMIT) number_of.buy_limit++;
if(OrderType()==OP_BUYSTOP) number_of.buy_stop++;
if(OrderType()==OP_SELL) number_of.sell++;
if(OrderType()==OP_SELLLIMIT) number_of.sell_limit++;
if(OrderType()==OP_SELLSTOP) number_of.sell_stop++;
}
}
}
//+------------------------------------------------------------------+
In generale, cosa state cercando di fare con questo, scusate, codice inquietante?
come scrivere il seguente :
Se il prezzo è cambiato dell'1%, ad esempio OPEN day più di Slose day dell'1%
come scrivere il seguente :
Se il prezzo è cambiato dell'1%, diciamo OPEN day più di Slose day dell'1%.
È diverso, ora è chiaro a cosa si riferisce l'1% ;)
L'Expert Advisor conta i minimi e i massimi delle ultime X barre e piazza gli ordini in base ad essi. Inoltre, se c'è una diminuzione del massimo o un aumento del minimo, è necessario cancellare l'ordine corrispondente e aprirlo con i nuovi dati.
Perché cancellare quando si può modificare il prezzo di impostazione e lo stop e il takeout relativi al nuovo livello? Dopo tutto, si piazzano ordini pendenti solo quando non ci sono ordini pendenti e non ci sono posizioni sul mercato. Quindi: se c'è un ordine pendente nel mercato e non c'è una posizione di mercato corrispondente, allora dobbiamo solo modificare i prezzi dell'ordine pendente - il prezzo impostato a un nuovo livello e il suo ordine stop - rispettivamente al nuovo livello.
Ogni volta è necessario ricordare i prezzi trovati di Max e Min. Se l'attuale prezzo trovato di Max è inferiore al precedente, modifichiamo il BuyLimit pendente e memorizziamo il nuovo prezzo di Max. Per il prezzo Min, speculare.