[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 303

 
costy_:

Ci sono molte opzioni, per esempio registrare i tempi aperti in un file, ma è più facile scorrere gli ordini aperti e confrontare i tempi di vita

.

In generale, riformulare .

..

"È necessario chiudere tutte le posizioni aperte dopo un determinato intervallo di tempo

" per ogni singola posizione (è così che ho capito la domanda). grazie! La parola "più facile" nella tua risposta è la parola chiave, significa che non c'è questa funzione incorporata. Volevo solo chiudere ogni singola posizione 2 ore dopo la sua apertura .
 
costy_:

Lo script non troverà il tempo del tester così facilmente (ma l'indicatore sì), puoi attaccarlo all'inizio dell'advisor del test

in modo rapido e affidabile ...

Grazie. Fatto nello script in questo modo:
    datetime time_start=GlobalVariableGet( "Time_test");
//    Alert(iBarShift(NULL,0,time_start)); 
    EndBar =  iBarShift(NULL,0,time_start);
Tutto funziona.
 

Sto cercando di scrivere un inikator. Non capisco perché ridisegna. Inoltre, attinge solo al rendering. Per favore, aiutatemi. Sono nuovo nella programmazione.

#proprietà indicator_chart_window
#proprietà indicator_buffers 2
#property indicator_color1 Magenta
#property indicator_color2 Red
//---- parametri di ingresso
extern int N;
datetime some_time=D'1971.01.11 00:00';
datetime some_time_1=D'1971.01.11 00:00';
//---- buffer
doppio RLB_Buffer[];
doppio RLB_Buffer_1[];
double Real_Line_Balanse=0,x=0,last_high,last_low,RLB, Real_Line_Balanse_1=0,x1=0,last_high_1,last_low_1,RLB_1;
bool dirlong, prima;
int i, ii, bar_high, bar_low, first_t_bar, now_bar, first_t_bar_1, now_bar_1;
//+------------------------------------------------------------------+
//| funzione di inizializzazione dell'indicatore personalizzato
//+------------------------------------------------------------------+
int init()
{
stringa short_name;
//---- linea di indicazione
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 159);
SetIndexBuffer(0,RLB_Buffer);
//----;
SetIndexStyle(1, DRAW_ARROW);
SetIndexArrow(1,159);
SetIndexBuffer(1,RLB_Buffer_1);
ritorno(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
Comment(i," ",ii);
//----
se(Bars < 3)
ritorno(0);
//----------
first_t_bar=iBarShift(NULL,0,some_time,false); //le barre tendono verso l'alto
now_bar=iBarShift(NULL,0,TimeCurrent(),false); /ultima barra, la più a destra
i=barre contate-prima_t_bar+1;
//------------
first_t_bar_1=iBarShift(NULL,0,some_time_1,false); //trend start bar
now_bar_1=iBarShift(NULL,0,TimeCurrent(),false); /ultima barra, la più a destra
ii=barre contate-primo_t_bar_1+1;
// if(IsVisualMode()==TRUE) i=first_t_bar-counted_bars-1; //if(counted_bars), allora trend start bar
if(counted_bars == 0)
{
primo = falso;
i=primo_t_bar+1;
ii=primo_t_bar_1+1;
}
//------------ //minori barre contate
dirlong = falso;
se(iMA(NULL,0,1,0,MODE_SMA,PRICE_MEDIAN,0)>iMA(NULL,0,2,0,MODE_SMA,PRICE_MEDIAN,0))dirlong = true;
if(dirlong == true) //se la tendenza è al rialzo
{
mentre(i>=0)
{
x++; //conteggio delle barre dall'inizio del trend
Real_Line_Balanse=Close[i+5]; //conteggio della somma dei rallentamenti della tendenza
RLB=Real_Line_Balanse;
if(RLB<Low[1]) RLB_Buffer[i]=Real_Line_Balanse; //mostrare la linea solo se il prezzo è alto
//-------
if(RLB>Close[i]&& x>50) //se il prezzo ha attraversato RLB dall'alto in basso
{
bar_high=iHighest(NULL,0,MODE_HIGH,first_t_bar,now_bar);//poi determinare HIGH tra
/ultima barra e inizio della tendenza
some_time_1=Time[bar_high]; //nuovo inizio della tendenza al ribasso
x=0; //azzeramento del contatore di barre dall'inizio del trend
Real_Line_Balanse=0;
}
i--;
}//while
//-------
}//dirlong
//---------------------
//---------------------
if(dirlong == false) //se la tendenza è al ribasso
{
mentre(ii>=0)
{
x1++; //conteggio delle barre dall'inizio del trend
Real_Line_Balanse_1=Close[ii+10]; //conta la quantità di barre del trend
RLB_1=Real_Line_Balanse_1;
if(RLB_1>High[1]) RLB_Buffer_1[ii]=Real_Line_Balanse_1;
//-------
if(RLB_1<Close[ii]&& x1>50) //se il prezzo ha attraversato la RLB dall'alto in basso
{
bar_low=iLowest(NULL,0,MODE_LOW,first_t_bar_1,now_bar_1);//poi determinare il LOW tra
/ultima barra e inizio della tendenza
some_time=Time[bar_low]; //nuovo inizio della tendenza al rialzo
x1=0; //azzeramento del contatore di barre dall'inizio del trend
Real_Line_Balanse_1=0;
}
ii--;
} //while
//-------
}//dirlong
//---------------------
ritorno(0);
}
//+------------------------------------------------------------------+

 

Questa è una sciocchezza. Invece di

i=barre contate-prima_t_bar+1;

Ho messo un disegno che conta le barre che conta se stesso. Tutto ha cominciato a scorrere senza intoppi. IndicatorCounted(); glitch o non capisco...

 

come informare una variabile sullo stato di un ordine chiuso?


avatar
2
vitaluxa 29.10.2011 21:26
Ciao!

Se un EA ha aperto un ordine e questo ha chiuso su Stop Loss o Take Profit, come posso informare la variabile che l'ordine ha chiuso esattamente su Stop Loss o Take Profit?
Grazie in anticipo!
 
001:

Questa è una sciocchezza. Invece di

i=barre contate-prima_t_bar+1;

Ho inserito un costrutto che conta le barre contate stesse. Tutto va bene. IndicatorCounted(); glitch o non capisco...

Si usa while(i>=0), quindi quando appare una nuova candela, i=1 (per assicurarsi che i dati della candela precedente siano contati una volta dai dati registrati).

Perché inserire some_time=D'1971.01.11 00:00'; usare Bars , IndicatorCounted non funziona per me (beh, l'errore è probabilmente dovuto alla first_t_bar).

Il tuo algoritmo e dovresti correggerlo.

"Sono nuovo nella programmazione."Dal 2007).

 
sergeev:

come informare una variabile sullo stato di un ordine chiuso?


:)

+ ...

Per Vitaluha:

https://docs.mql4.com/ru/trading/OrderStopLoss

https://docs.mql4.com/ru/trading/OrderTakeProfit

 
Buon pomeriggio, potreste dirmi perché le quotazioni dal 10 giugno al 22 settembre di quest'anno non possono essere caricate? Ho fatto due o tre upload di cronologia e tutti hanno lo stesso gap nei dati.
 
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Закрвает открытые позиции через 2 суток
void DelOldPositions()                                    
{   
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
    {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
        {
         if (OrderOpenTime()+2*24*60*60  > TimeCurrent())  
          {
           OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,4 ),3,Red);
          }
        }
   }
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
Помогите поправить 2 последние строки, т.к. в тестере почему-то  мгновенно  закрывает все открытые позы. С уважением.
 

Il problema è che l'EA riapre costantemente gli ordini, cioè c'è un segnale di acquisto - apre un ordine, poi lo chiude a profitto, e le condizioni sono ancora conservate lo apre di nuovo.

Ho pensato che potrebbe essere gestito con il tradizionale contatore di acquisto e vendita - se un ordine di acquisto ha aperto il contatore +1 e un nuovo acquisto non può essere aperto fino a quando il contatore è 0 e il contatore viene resettato solo quando viene chiuso.

extern double TakeProfit = 150;
extern double Sl = 150;
extern double Lots = 0.1;
extern int n = 9;     
        
//-----------------------------------------------------------

int start()
 {
  int cnt, ticket, total, i, Buy=0, Sell=0;
  double x1=iIchimoku(NULL,0,9,26,52,MODE_TENKANSEN,0);   //красная
  double x2=iIchimoku(NULL,0,9,26,52,MODE_KIJUNSEN,0);    //синяя
  double x3=iIchimoku(NULL,0,9,26,52,MODE_SENKOUSPANA,0); //фиол пунктир
  double x4=iIchimoku(NULL,0,9,26,52,MODE_SENKOUSPANB,0);  //кр пунктир
  double x5=iIchimoku(NULL,0,9,26,52,MODE_CHINKOUSPAN,0);  //зеленая
  double x6=Ask;
  double x61=Bid;
  double Lot=0;  
  total=OrdersTotal();
  
  for (i=total-1;i>=0;i--)   //счетчик выставленных ордеров
   { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
       {
         if(OrderType()==OP_BUY)
          { 
           Buy++;
            }  
          if (OrderType()==OP_SELL)
           { 
            Sell++;
             }  
        }
     }
  if(total<1)//проверка количества ордеров 
   {
    
         if(AccountFreeMargin()<(100*Lots))
              {
     Print("Недостаточно средств = ", AccountFreeMargin());
     return(0);  
               }

         if (x6>x3 && x6>x4 && x1>x2 && x6>x2 && x6<(x2+60) && Buy==0) //бай
               {
                   ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-Sl*Point,Ask+TakeProfit*Point,0,0,0,Green); Sell=0; // ордер и обнуление счетчика
                      if(ticket>0)
                      {
                         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("открыта позиция BUY : ",OrderOpenPrice());
      
                         else Print("Ошибка при открытии BUY позиции : ",GetLastError()); 
                        }
              }
   
         if (x6<x3 && x6<x4 && x1<x2 && x6<x2 && x6>(x2-60) && Sell==0) //селл 
                {
                   ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+Sl*Point,Bid-TakeProfit*Point,0,0,0,Red); Buy=0; //сам по себе ордер и обнуление счетчика 
                     if(ticket>0)
                     {
                         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("открыта позиция SELL : ",OrderOpenPrice());
    
                         else Print("Ошибка при открытии SELL позиции : ",GetLastError());
      
                      } 
    
                  }
  
  
  } 

   if((OrderType()==0 && x61<x3 && x61<x4 && x1>x2 && x1>x3 && x1>x4) || (OrderType()==1 && x61>x3 && x61>x4 && x1<x2 && x1<x3 && x1<x4)) //закрытиеи на развороте
      {
          bool   result;
          double price;
          int    cmd,error;
//----
          if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
              {
                  cmd=OrderType();
                  if(cmd==OP_BUY || cmd==OP_SELL)
                    {
                      while(true)
                        {
                         if(cmd==OP_BUY) price=Bid;
                         else            price=Ask;
                         result=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
                         if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
                         else error=0;
                         if(error==135) RefreshRates();
                         else break;
                        }
                     }
               }
          else Print( "Error when order select ", GetLastError());
//----
          
      }
 
 }
 
 
File:
Motivazione: