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

 

L'EA ha il seguente blocco (Contatore di eventi):

if (isCloseLastPosByStop()==True) //se l'ultimo ordine è stato chiuso da Stop

{
N=N+1;
Alert(N, " alce");
} else N=0;

DOMANDA: come scrivere i dati in un file (excel) invece di visualizzarli sullo schermo?

 
Dimka-novitsek:

Buon pomeriggio, potreste dirmi come può essere, seleziono un ordine in un ciclo, passo attraverso quale ordine è ultimo e lo ricordo così ticket = OrderTicket();

In questo caso diciamo che è il numero due. Un po' più tardi se (ticket>-1){
OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISTORY);

e ottengo spesso l'errore 4105 - ordine non selezionato!!!


E questo perché l'ordine non è stato ancora chiuso. Non è in MODE_HISTORY, è ancora in MODE_TRADES.
 

for(  i=0;i<=OrdersHistoryTotal();i++){
    OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY);
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKET,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;

Impossibile! Perché no? Non c'erano ordini aperti al momento del superamento! Forse non capisco.

Il ciclo di ricerca è anche sulla storia! È qui che lo assegno alla variabile int ticket!

E giura, mi scusi, 2012.02.04 11:28:47 2011.12.06 16:35 GMT EURUSD,M30: Alert: SELL Select error HISTORYticket 4105

Quando passa da MODE_HISTORY a MODE_TRADES?

E soprattutto, seleziono lo stesso ordine nella storia con l'aiuto di order select, ed è selezionato per primo, altrimenti non potrei lavorarci! Non c'è logica !!!!!! Sono scioccato...




 
Dimka-novitsek:

Impossibile! Perché no? Non c'erano ordini aperti al momento del superamento! Forse non capisco.

Il ciclo di ricerca è anche sulla storia! È qui che lo assegno alla variabile int ticket!

E giura, mi scusi, 2012.02.04 11:28:47 2011.12.06 16:35 GMT EURUSD,M30: Alert: SELL Select error HISTORYticket 4105

Quando passa da MODE_HISTORY a MODE_TRADES?


ticket=-1;
for(  i=0;i<OrdersHistoryTotal();i++){
    if (OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY));{
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKETJ ,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;
Aggiunta una linea all'inizio e corrette le due linee di codice successive.
 
Grazie!!!
 

aiutare a inserire uno stop loss in un EA

per favore

File:
my_1.mq4  10 kb
 
Si prega di condividere la funzione per calcolare il lotto massimo ammissibile, tenendo conto delle posizioni aperte, cioè il patrimonio netto. La funzione standard calcola il rischio, ma se ci sono scambi, non ci sono abbastanza soldi per aprirli
 
T-G:
Si prega di condividere la funzione per calcolare il lotto massimo ammissibile, tenendo conto delle posizioni aperte, cioè il patrimonio netto. La funzione standard calcola il rischio, ma se ci sono scambi, non ci sono abbastanza soldi per aprirli


Nel caso più semplice è così:

double Klots = 0.1; //коэфф. риска (определяет желаемый размер лота от максимально возможного в данный момент.)

Lots=NormalizeDouble(Klots*AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);Lots=MathMax(MarketInfo(Symbol(),MODE_MINLOT),Lots);
 

Ragazzi, potete consigliarmi su questa domanda?

Ecco uno script per trovare la dimensione massima del gioco a zig-zag da crenfx - vedi qui:

#property show_inputs

extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

#define MAX_POINTS 10000

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

void start()
{
  int ZigZagData[];
  int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
  ArraySort(ZigZagData);
  
  Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");
        
  return;
}

Lo lancio sul grafico dello strumento su M5 - funziona bene con il timeframe di default

extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

è la profondità massima della storia per il simbolo nell'ufficio Alpari quando lo si carica con F2 - l'ho controllato, cioè sembra il contenuto della scheda "Esperti" del terminale client - sembra essere vero:

Quando si usa lo stesso progetto di script nel mio EA sullo stesso intervallo di tempo sullo stesso periodo grafico M5 non conta correttamente, cioè

calcola numeri molto diversi (più piccoli che nello script) o 0. Quale può essere l'errore o può essere qualche tipo di incoerenza della storia? Grazie.

Cioè, inizio nel tester con owl dopo il tempo stimato per trovare un failsafe, in teoria tutto è normale e i numeri alla fine dello script e di owl dovrebbero essere gli stessi... Quale potrebbe essere l'errore?

 

Ecco come carico questo script al mio gufo:

extern string A3 = "Расчет безотката";
//РАСЧЕТ БЕЗОТКАТА ДЛЯ РАССТАВЛЕНИЯ ОРДЕРОВ С ЗАДАННЫМ ШАГОМ
extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';
#define MAX_POINTS 1000000

//extern double grid = 1000;          // размер безотката в пунктах



//+------------------------------------------------------------------+
//| Старт робота                                                     |
//+------------------------------------------------------------------+

int init()
{   
       
  //------------------     ШАГ СЕТКИ   ---------------------------------------------------------------------------------------

 //Pipstep = grid/Max_Iteration;
 //Pipstep = NormalizeDouble(Pipstep,0);  
 // СЧИТАЕМ БЕЗОТКАТ
    int ZigZagData[];
    int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
    ArraySort(ZigZagData);
  
    Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");        

  
   
    return (0);
}

...
...

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

Sembra essere tutto uguale - quale potrebbe essere l'errore?