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
Ok, ha funzionato, ma ora il problema è la performance. Controllare l'intera storia richiede tempo. Ho fatto un backtest per un anno e mezzo e ho notato che è lento. La ragione è che sto controllando tutti gli ordini nella storia e confronto il loro prezzo di chiusura e il tempo di chiusura. Quindi, c'è un modo per limitare la ricerca nella cronologia in modo che cerchi solo gli ordini recenti? Posso aumentare le prestazioni in qualche modo?
si può provare
OrderSelect(HistoryTotal(),SELECT_BY_POS,MODE_HISTORY);
ma non sono sicuro per questo, penso che prenderà l'ultimo ordine in tutta la storia
grazie
ciao gente...
qualcuno può aiutarmi...
Ho un indicatore per creare EA....
si può provare
OrderSelect(HistoryTotal(),SELECT_BY_POS,MODE_HISTORY);
ma non sono sicuro per questo, penso che prenderà l'ultimo ordine in tutta la storia
graziemodificato del mio difetto...deve essere
OrderSelect(HistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY);
Scusate il doppio post ma ho davvero bisogno di aiuto...
Sono disperato. Ho provato tutta la notte a far funzionare il mio array ma non succede niente. Ho cercato davvero di essere autosufficiente e di cercare di imparare, ma non riesco ancora ad arrivare dove devo andare. Se qualcuno potesse avere pietà di me e prestarmi assistenza....PLEASE!!!!!
Sto eseguendo uno script di griglia ma vorrei tenere traccia di quanti lotti sto eseguendo per Symbol. Voglio essere in grado di sommare la mia posizione totale per dimensione del lotto. Diciamo che ho 0.10, 0.10, 0.10, 0.10, 0.20, 0.30, voglio essere in grado di sapere che ho l'equivalente di 0.90 lotti. Vorrei anche sapere le dimensioni minime e massime dei lotti....0.10 e 0.30
ArrayResize(OrderArray, i);
ArrayInitialize(OrderArray,0);
cnt = 0;
for (i = 0; i < OrdersTotal(); i++)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )
{
OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();
OrderArray[cnt][OPEN] = OrderOpenPrice();
OrderArray[cnt][LOTS] = OrderLots();
if(OrderType() == OP_BUY)
{
////// I can't get anything to work!!!!!!!
BuyLots += OrderArray[cnt][LOTS];
////// This returns Zero when I place BuyLots in my Comments
////// This returns error messages
MaxBuyLots =ArrayMaximum(OrderArray[LOTS],WHOLE_ARRAY,0);
}
Scusa per il doppio post ma ho davvero bisogno di aiuto...
Sono disperato. Ho provato tutta la notte a far funzionare il mio array ma non succede niente. Ho cercato davvero di essere autosufficiente e di cercare di imparare, ma ancora non riesco ad arrivare dove devo andare. Se qualcuno potesse avere pietà di me e prestarmi assistenza....PLEASE!!!!!
Sto eseguendo uno script a griglia ma vorrei tenere traccia di quanti lotti sto eseguendo per Symbol. Voglio essere in grado di sommare la mia posizione totale per dimensione del lotto. Diciamo che ho 0.10, 0.10, 0.10, 0.10, 0.20, 0.30, voglio essere in grado di sapere che ho l'equivalente di 0.90 lotti. Vorrei anche sapere le dimensioni minime e massime dei lotti....0.10 e 0.30
Il problema è che l'arrayresize() ridimensiona solo il primo elemento, non il secondo. Ovviamente le macro LOTS, PROFIT e OPEN devono essere rispettivamente 0,1,2. Anche l'oggetto count nel ciclo for è (i) ma il codice del blocco si riferisce a (cnt). prova questo e vedi se funziona.
double OrderArray[][3];
ArrayResize( OrderArray, OrdersTotal() );
cnt = 0;
for (cnt = 0; cnt< OrdersTotal(); cnt++)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )
{
OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();
OrderArray[cnt][OPEN] = OrderOpenPrice();
OrderArray[cnt][LOTS] = OrderLots();
if(OrderType() == OP_BUY)
{
double BuyLots;
BuyLots += OrderArray[cnt][LOTS];
MaxBuyLots =ArrayMaximum(OrderArray);
}
Grazie Nicholishen,
Mi sto avvicinando un po'. BuyLots sta restituendo ciò che voglio, ma ArrayMaximum mi sta dando un numero strano che non riesco a capire. Non sta restituendo il più grande LotSize.
Apprezzo molto l'aiuto.
dee
Grazie Nicholishen,
Mi sto avvicinando un po'. BuyLots sta restituendo ciò che voglio, ma ArrayMaximum mi sta dando un numero strano che non riesco a capire. Non sta restituendo il più grande LotSize.
Apprezzo molto l'aiuto.
deeSe hai bisogno di dividere l'array in diversi array o scrivere un ciclo per estrarre il massimo dell'array, ad esempio:
ArrayResize( OrderArray, OrdersTotal() );
cnt = 0;
for (cnt = 0; cnt< OrdersTotal(); cnt++)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )
{
OrderArrayProfit[cnt] = OrderProfit() + OrderSwap();
OrderArrayOpen[cnt] = OrderOpenPrice();
OrderArrayLots[cnt] = OrderLots();
if(OrderType() == OP_BUY)
{
double BuyLots;
BuyLots += OrderArrayLots[cnt];
MaxBuyLots =ArrayMaximum(OrderArrayLots);
}
[/CODE]
or
[CODE]double OrderArray[][3];
ArrayResize( OrderArray, OrdersTotal() );
cnt = 0;
for (cnt = 0; cnt< OrdersTotal(); cnt++)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )
{
OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();
OrderArray[cnt][OPEN] = OrderOpenPrice();
OrderArray[cnt][LOTS] = OrderLots();
if(OrderType() == OP_BUY)
{
double BuyLots;
BuyLots += OrderArray[cnt][LOTS];
}
double MBL;
for(int i=0;i<OrdersTotal();i++){
if(OrderArrayLots[LOTS]>MBL)MBL=OrderArrayLots[LOTS];
}
MaxBuyLots =MBL;
Ecco un altro esempio di una funzione che tiene traccia dei trailing stop stretti su più operazioni sulla stessa valuta accoppiando i dati di trailing con il numero di ticket dell'operazione corrispondente, usando degli array. Forse questo vi aiuterà a dare qualche idea.
double tsPrice[21];
bool tsok[21];
int tkt3[20];
int SuperClose(){// superclose by nicholishen
int cnp=ordercnt();
for(int i=0;i<cnp;i++){
if(OrderMatch(i)){
if(0==0){//Pulls in order that meets the criteria for processing
int num=0;int pos=0;
for(int b=0;b<21;b++){// this (loopB) compares the ticket# of the selected order against the number stored in the ticket array
if(tsTicket==OrderTicket() ){
num++; pos=b;// if ticket numbers match, pos is the position in the array where the trailing data is stored
break;
}
}
if(num==0){ // if the loopB did not find a matching ticket number it is time to initialize the data
for(int j=0;j<21;j++){
if(tsTicket[j]==0){// this is looking for the earliest instance within the array to store the data
pos=j;
break;
}
}
tsTicket[pos]=OrderTicket();// setting the ticket number
tsok[pos]=false;// this is to determine when trailing kicks in
// Print("(",pos,") New ticket initialized = ",tsTicket[pos]);
}
if (OrderType()==OP_SELL) {
if (!tsok[pos] && (OrderOpenPrice()-Ask>=TSactivation*Point || TSactivation==0 ) ) {// if the trailing factor is false, but it has hit the activation point continue
tsPrice[pos]=Ask+TrailPips*Point;// this is the new trailinf stop price
tsok[pos]=true;// it's ok to proceed with trailing stop
if(TrailPips>8){// if this distance from the current price to the new stop, then modify the order.
ModifyStopLoss(Ask+TrailPips*Point,OrderTakeProfit());//modifies order
}
}
if (tsok[pos] && Ask+TrailPips*Point < tsPrice[pos] ){//if the position is gaining in profit
tsPrice[pos]=Ask+TrailPips*Point;
if(TrailPips>8){
ModifyStopLoss(Ask+TrailPips*Point,OrderTakeProfit());
}
}
if (tsok[pos] && Ask >= tsPrice[pos] ){// if the postion hits the stop price
if(CloseOrder(Ask)==STOP)return(STOP);
Print("Short Order ",tsTicket[pos]," Closed from TS");
}
}
else if (OrderType()==OP_BUY) {// reverse of SELL
if(!tsok[pos] && (Bid-OrderOpenPrice() >= TSactivation*Point || TSactivation==0 ) ) {
tsPrice[pos]=Bid-TrailPips*Point;
tsok[pos]=true;
if(TrailPips>8){
ModifyStopLoss(Bid-TrailPips*Point,OrderTakeProfit());
}
}
if (tsok[pos] && Bid-TrailPips*Point > tsPrice[pos] ){
tsPrice[pos]=Bid-TrailPips*Point;
if(TrailPips > 8){
ModifyStopLoss(Bid-TrailPips*Point,OrderTakeProfit());
}
}
if (tsok[pos] && Bid <= tsPrice[pos] ){
if(CloseOrder(Bid)==STOP)return(STOP);
Print("Long Order ",tsTicket[pos]," Closed from TS");
}
}
}
}
if(RefreshRates())return(STOP);
}
for(i=0;i<21;i++){// this searches the array for ticket numbers that are now obsolete due to an order that has closed
if(tsTicket>0){
bool found=false;
for(b=0;b<OrdersTotal();b++){
OrderSelect(b,SELECT_BY_POS);
if(tsTicket==OrderTicket()){
found=true;
break;
}
}
if(!found){// if there are matching ticket numbers in the trade pool and the array then nothing happens
tsTicket=0;tsPrice=0;tsok=false;// if there is an obolete ticket the the data is reset. And the next new ticket data can occupy this space
// Print("Array pos ",i," Cleaned");
}
}
}
return(0);
}
int ordercnt(){
int c;
for(int i=0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS)){
if(OrderMagicNumber()==ID && OrderSymbol()==Symbol()){
tkt3[c]=OrderTicket();
c++;
}
}
}
return(c);
}
//+------------------------------------------------------------------+
int curcnt(){
int c;
for(int i=0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
c++;
return(c);
}
}
}
return(c);
}
//+------------------------------------------------------------------+
bool OrderMatch(int i){
if(OrderSelect(tkt3,SELECT_BY_TICKET)){
if(OrderMagicNumber()==ID && OrderSymbol()==Symbol()){
return(true);
}
}
return(false);
}Grazie ancora!
Ho cambiato la 3a dell'ultima linea con questa
e l'ho fatto funzionare. L'ora di andare a letto è passata da un pezzo. Domani, quando mi sveglierò, studierò la logica del tuo codice. Ma siccome sono testardo, capirò come usare la maledetta funzione ArrayMaximum! Dovrò anche leggere di più sull'indicizzazione per vedere come i miei vecchi metodi erano così sbagliati.
Grazie ancora!!!!
dee
Grazie ancora!
Ho cambiato la 3a dell'ultima linea con questa
e l'ho fatto funzionare. L'ora di andare a letto è passata da un pezzo. Domani, quando mi sveglierò, studierò la logica del vostro codice. Ma siccome sono testardo, capirò come usare la maledetta funzione ArrayMaximum! Dovrò anche leggere di più sull'indicizzazione per vedere come i miei vecchi metodi erano così sbagliati.
Grazie ancora!!!!
deesolo per farti risparmiare tempo, la ragione per cui la funzione max non funzionava per quello che volevi è perché stai usando un array multidimensionale e stai memorizzando diversi tipi di dati. Restituirà il massimo di quei dati, quindi è probabile che tu stia restituendo un numero di profitto o qualcosa di più alto della tua VERA dimensione massima del lotto