Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 451

 
//+------------------------------------------------------------------+
//| cancellare e/o chiudere un ordine, filtrato per volume
//---------------------------------------------------------------------
#proprietà show_inputs
//--------------------------------------------------------------------
extern double MinLot = 0.01; / lotto minimo che deve essere cancellato/chiuso
extern double MaxLot = 0.1; //lotto massimo che viene cancellato/bypassato
extern bool Buy = false; //cancella/chiude la direzione degli ordini di acquisto
extern bool Sell = false; //cancella/chiude la direzione degli ordini di vendita
extern bool pending = true; //cancellare gli ordini in sospeso
extern bool market = true; //chiude le posizioni di mercato
extern int slippage = 2; //slippage del prezzo alla chiusura delle posizioni di mercato
//--------------------------------------------------------------------
int start()
{
doppio SL,TP;
string txt=StringConcatenate("Script remove or close order, start ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
RefreshRates();

bool error=true;
int Errore,OT,Biglietto,nn;
doppio OOP, OL;
mentre(vero)
{
per (int j = OrdiniTotali()-1; j >= 0; j--)
{
se (OrderSelect(j, SELECT_BY_POS))
{
se ((OrderSymbol() == Symbol())
{
OL = OrderLots();
se (OL<MinLot || OL>MaxLot) continua;
OT = OrderType();
se (!mercato && OT<2) continua;
se (!pending && OT>1) continua;
Ticket = OrderTicket();
OOP = OrderOpenPrice();
se (OT==OP_BUY)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Bid,Digits),slippage,Red);
if (error) txt = StringConcatenate(txt,"\nClosed BUY Order",Ticket);
else txt = StringConcatenate(txt,"\nClosing error ",GetLastError());
}
se (OT==OP_SELL)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Ask,Digits),slippage,Blue);
se (errore) txt = StringConcatenate(txt, "SELL order closed",Ticket;)
else txt = StringConcatenate(txt,"\nError ",GetLastError()," close ",Ticket);
}
se (OT>1)
{
error=OrderDelete(Ticket);
se (errore) txt = StringConcatenate(txt,"\nOrderDeleted ",StrOrdersType(OT)," ",Ticket);
else txt = StringConcatenate(txt,"\nError ",GetLastError()," removal ",StrOrdersType(OT)," ",Ticket);
}
se (!errore)
{
Errore = GetLastError();
se (Errore<2) continua;
se (Errore==129)
{ Comment("Prezzo errato ",TimeToStr(TimeCurrent(),TIME_SECONDS));
Dormire(5000);
RefreshRates();
continuare;
}
se (Errore==146)
{
j++;
se (IsTradeContextBusy()) Dormire(2000);
continuare;
}
Comment("Error ",Error," closing order N ",OrderTicket(),
",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
}
}
}
int n=0;
per (j = 0; j < OrdiniTotali(); j++)
{
se (OrderSelect(j, SELECT_BY_POS))
{
se (OrderSymbol() == Symbol())
{
OL = OrderLots();
se (OL<MinLot || OL>MaxLot) continua;
OT = OrderType();
se (!mercato && OT<2) continua;
se (!pending && OT>1) continua;
n++;
}
}
}
se (n==0) break;
nn++;
if (nn>10) {Comment("Impossibile chiudere tutte le operazioni, c'è ancora ",n);break;}
Dormire(1000);
RefreshRates();
}
Comment(txt,"\nScript ha finito il suo lavoro ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
ritorno(0);
}
//--------------------------------------------------------------------
stringa StrOrdersType(int t)
{
se (t==OP_BUY) return("Compra");
se (t==OP_SELL) return("Sell");
se (t==OP_BUYLIMIT) return("BuyLimit");
se (t==OP_SELLLIMIT) return("SellLimit");
se (t==OP_BUYSTOP) return("BuyStop");
se (t==OP_SELLSTOP) return("SellStop");
}

//--------------------------------------------------------------------

Cosa dovrei aggiungere o cambiare nello script per chiudere tutti gli ordini aperti per tutte le coppie per dimensione del lotto.

 
Vitek, usa il tasto SRC per inserire il codice! Chi ha bisogno di scavare tra scarabocchi illeggibili?!
 
pu6ka:
Sì, i prezzi di Ask non sono visibili, ma lo sono :)
Nel visualizzatore, puoi premere pausa e selezionare "Show Ask line" nelle proprietà del grafico e continuare a testare. Il grafico dei prezzi in MT4 è normalmente tracciato da Bid.

Da cosa dipende la qualità dei test e come si può aumentare al massimo?
 
Zver4991:

e da cosa dipende la qualità dei test e come può essere migliorata verso il massimo?
Onestamente non lo so. Non ne ho ancora avuto bisogno, guarda sul sito web
 

Cari professionisti.
Potreste dirmi come aprire una griglia di ordini pendenti senza usare i cicli?
Se non è difficile, si prega di mostrare almeno un esempio approssimativo di tale codice,
con la possibilità di cambiare il passo e la dimensione del lotto di ogni ordine successivo della griglia.

 
Forexman77:
Ho messo delle linee

invece diint Ticket; vengono fuori degli errori:

'=' - parentesi quadra sinistra prevista per l'array('=' - parentesi quadra sinistra, prevista per l'array)

'>' - parentesi quadrata sinistra prevista per l'array ('=' - parentesi quadrata sinistra prevista per l'array)

'>' - token inatteso('>' - token inatteso)

')' - assegnazione prevista ('' - assegnazione prevista)

'continue' - 'break' o 'continue' usato solo all'interno di alcuni cicli)

e molto di più.


Quindi Ticket è ancora usato da qualche parte nella vecchia versione. Dobbiamo pulire il codice...
 
1mql:

Cari professionisti.
Potreste dirmi come aprire una griglia di ordini pendenti senza usare i loop?
Se non è difficile, si prega di mostrare almeno un esempio approssimativo di tale codice,
Se è possibile cambiare il passo e la dimensione del lotto di ogni ordine successivo nella griglia.

Sì, in effetti, è lo stesso che in un ciclo... ...ma senza il loop. Mostraci come ti apri in un loop e spiega perché non vuoi usare i loop, perché non è chiaro cosa stai cercando di ottenere.
 
borilunad:
Vitek, usa il tasto SRC per incollare il codice! Chi ha bisogno di scavare tra scarabocchi illeggibili!

//+------------------------------------------------------------------+
//| удаления и/или закрытие ордера, с фильтрацией его по объему |
//---------------------------------------------------------------------
#property show_inputs
//--------------------------------------------------------------------
extern double MinLot = 0.01; //минимальный лот который удаляем/закываем
extern double MaxLot = 0.1; //максимальный лот который удаляем/закываем
extern bool Buy = false; //удалять/закрывать направление buy ордеров
extern bool Sell = false; //удалять/закрывать направление sell ордеров
extern bool pending = true; //удалить отложенные ордера
extern bool market = true ; //закрыть рыночные позиции
extern int slippage = 2; //проскальзывание цены при закрытии рыночных позиций
//--------------------------------------------------------------------
int start()
{
double SL,TP;
string txt=StringConcatenate("Скрипт удаления или закрытие ордера, старт ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
RefreshRates();

bool error=true;
int Error,OT,Ticket,nn;
double OOP,OL;
while(true)
{
for (int j = OrdersTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if ((OrderSymbol() == Symbol()))
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
Ticket = OrderTicket();
OOP = OrderOpenPrice();
if (OT==OP_BUY)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Bid,Digits),slippage,Red);
if (error) txt = StringConcatenate(txt,"\nЗакрыт ордер BUY ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка закрытия ",GetLastError());
}
if (OT==OP_SELL)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Ask,Digits),slippage,Blue);
if (error) txt = StringConcatenate(txt,"\nЗакрыт ордер SELL ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка ",GetLastError()," закрытия ",Ticket);
}
if (OT>1)
{
error=OrderDelete(Ticket);
if (error) txt = StringConcatenate(txt,"\nУдален ордер ",StrOrdersType(OT)," ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка ",GetLastError()," удаления ",StrOrdersType(OT)," ",Ticket);
}
if (!error)
{
Error = GetLastError();
if (Error<2) continue;
if (Error==129)
{ Comment("Неправильная цена ",TimeToStr(TimeCurrent(),TIME_SECONDS));
Sleep(5000);
RefreshRates();
continue;
}
if (Error==146)
{
j++;
if (IsTradeContextBusy()) Sleep(2000);
continue;
}
Comment("Ошибка ",Error," закрытия ордера N ",OrderTicket(),
" ",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
}
}
}
int n=0;
for (j = 0; j < OrdersTotal(); j++)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if (OrderSymbol() == Symbol())
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
n++;
}
}
}
if (n==0) break;
nn++;
if (nn>10) {Comment("Не удалось закрыть все сделки, осталось еще ",n);break;}
Sleep(1000);
RefreshRates();
}
Comment(txt,"\nСкрипт закончил свою работу ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
return(0);
}
//--------------------------------------------------------------------
string StrOrdersType(int t)
{
if (t==OP_BUY) return("Buy");
if (t==OP_SELL) return("Sell");
if (t==OP_BUYLIMIT) return("BuyLimit");
if (t==OP_SELLLIMIT) return("SellLimit");
if (t==OP_BUYSTOP) return("BuyStop");
if (t==OP_SELLSTOP) return("SellStop");
}
//--------------------------------------------------------------------

Cosa dovrei aggiungere o cambiare per chiudere tutti gli ordini aperti su tutte le coppie per dimensione del lotto.

 
Vitek2010:

Cosa dovrei aggiungere o cambiare per chiudere tutti gli ordini aperti su tutte le coppie per dimensione del lotto.

Sotto l'ultimo esterno:
extern int slippage = 2; // slippage del prezzo alla chiusura delle posizioni di mercato

inserirne un altro:
extern bool total_symb = true; //su tutte le coppie

e su ogni linea:
se ((OrderSymbol() == Symbol())
и
se(OrderSymbol() == Symbol())

sostituirlo con questo:
se(OrderSymbol() == Symbol() || total_symb)

Teoricamente dovrebbe funzionare, controlla.

 
La domanda è sorta, è possibile scrivere un Expert Advisor o uno script, che sarebbe quello di raggiungere per esempio una perdita del 2% il giorno chiuderebbe tutte le transazioni?