[ARŞİV] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 3. - sayfa 546

 

EA'da aşağıdaki bloğa sahibim (Olay sayacı):

if (isCloseLastPosByStop()==True) //Son sipariş Stop tarafından kapatılmışsa

{
N=N+1;
Uyarı (N, "geyik");
} başka N=0;

SORU: Bilgileri ekranda görüntülemek yerine bir dosyaya (excel) nasıl veri yazılır?

 
Dimka-novitsek :

Tünaydın! Bana nasıl olabileceğini söyle, bir döngüde bir sipariş seçiyorum, son siparişe göre sıralıyorum ve onu şöyle hatırlıyorum: Ticket = OrderTicket();

bu durumda, iki numara diyelim. Biraz sonra if (bilet>-1){
OrderSelect(bilet,SELECT_BY_TICKET,MODE_HISTORY);

ve genellikle 4105 hatası alıyorum - sipariş seçilmedi!!


Ama sipariş henüz kapanmadığı için. MODE_HISTORY'de değil, hala MODE_TRADES'te.
 

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( )  ) ;

Sen nesin! Neden? Arama sırasında açık emir yoktu! Belki anlamadım?

Ve numaralandırma döngüsü de tarih oldu! İçinde bir int bilet değişkeni atadığım yer

Ve yemin ederim, üzgünüm, bu yüzden 2012.02.04 11:28:47 2011.12.06 16:35 antibes EURUSD,M30: Uyarı: SATIŞ Select error HISTORYticket 4105

MODE_HISTORY'den MODE_TRADES'e ne zaman gelir?

Ve en önemlisi, sonuçta, ben de aynı sırayı seçiyorum, ayrıca bir sipariş seçimi yardımıyla tarihte de ve ilk etapta seçiliyor, aksi takdirde onunla çalışamazdım !! Mantık yok !!!!!! Şok oldum..

 
Dimka-novitsek :

Sen nesin! Neden? Arama sırasında açık emir yoktu! Belki anlamadım?

Ve numaralandırma döngüsü de tarih oldu! İçinde bir int bilet değişkeni atadığım yer

Ve yemin ederim, üzgünüm, bu yüzden 2012.02.04 11:28:47 2011.12.06 16:35 antibes EURUSD,M30: Uyarı: SATIŞ Select error HISTORYticket 4105

MODE_HISTORY'den MODE_TRADES'e ne zaman gelir?


 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 ( )  ) ;
Başa bir satır eklendi ve sonraki iki kod satırı düzeltildi.
 
Teşekkürler!!
 

danışmana bir stoploss eklemeye yardımcı olun

lütfen

Dosyalar:
my_1.mq4  10 kb
 
Lütfen açık pozisyonları , yani öz sermaye ile dikkate alarak izin verilen maksimum lotu hesaplama işlevini paylaşın. aksi takdirde standart olan riski dikkate alır, ancak anlaşmalar varsa, açmak için yeterli para yoktur.
 
TG :
Lütfen açık pozisyonları, yani öz sermayeyi dikkate alarak izin verilen maksimum lotu hesaplama işlevini paylaşın. aksi takdirde standart olan riski dikkate alır, ancak anlaşmalar varsa, açmak için yeterli para yoktur.


Bunun gibi en basit durumda:

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

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

Arkadaşlar lütfen bana şunu söyleyin:

İşte hrenfx'ten zikzak yaparak maksimum geri dönüşü olmayan boyutu bulmak için komut dosyası - buraya bakın:

 #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 ;
}

M5'teki alet tablosuna atıyorum - varsayılan zaman aralığıyla normal olarak sayılır

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

bu, Alpari ofisindeki enstrüman için F2 üzerinden indirirken geçmişin maksimum derinliğidir - Kontrol ettim, yani. istemci terminalinin "Uzmanlar" sekmesinin içeriğine benziyor - doğru görünüyor:

Expert Advisor'da aynı komut dosyası yapısını aynı zaman aralığında, aynı periyotta kullanırken, M5 grafiği doğru hesaplanmıyor, yani.

tamamen farklı (komut dosyasındakinden daha küçük) sayılar veya hatta 0 yazıyor. Hata ne olabilir veya bir tür geçmiş tutarsızlığı mı? Sayesinde.

Onlar. Baykuş test cihazında geri dönüşü olmayan tahmini süreden sonra başlıyorum, teoride - her şey yolunda ve komut dosyası ve baykuşun sonuçlarına dayanan sayılar AYNI olmalıdır ... Hata ne olabilir?

 

Bu betiği baykuşuma şu şekilde yüklüyorum:

 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);
}

Her şey aynı görünüyor - yanlış ne olabilir?

Neden: