Mqltick

 

mal eine kurze frage,


wie baut ihr euch die Abfrage in die OnTick ein damit man über mehr Pairs drübersehen kann?

die Pairs würde ich aus einem Array auswählen


   if(!ReadFileToArray(FileNamePair,lines))
     {
      Print("Error, see the \"Experts\" tab for details at OnTick");
     }
   else
     {
      for(int i=0;i<ArraySize(lines);i++)            // hier gehe ich den Array durch
        {       
         MqlTick tick &_Symbol;                      // hier würde ich gerne der VariableTick gleich den Symbolnahmen dazugeben                                                 
         if(!SymbolInfoTick(Symbol(),tick+_Symbol)) GetLastError();
        }
     }

ich habs auch schon mit + probiert


bin mir sicher da gibts einen Trick


danke

amando

 

Was ist denn das:

MqlTick tick &_Symbol;
if(!SymbolInfoTick(Symbol(),tick+_Symbol)) GetLastError();

Das kann so nicht funktionieren?

Du kannst das entweder mit Klassen oder mit mehreren Arrays machen. Ich würde die Klassenversion empfehlen.

Für die Lösung mit Arrays müsstest Du die Symbole in Hash-Zahlen (Typ ulong)  umwandeln und dann kannst Du einen sortierten (!ArraySort) Array aus den Hash-Zahlen (https://www.mql5.com/en/code/277) und den Indizes des Arrays mit den Strukturen von MqlTick erstellen. Zugriff über:

  1. int hash = (int)Hash_adler32(mySym);
  2. int idx = ArrayBSearch(ArrrayOfHash_Idx,hash) ;
  3. if ( !SymbolinfoTick(mySym,ArrayMqlTicks[idx] ) Print(_LastError);

Hash functions library
Hash functions library
  • www.mql5.com
General purpose hash functions: All three functions are adapted for MQL5 Unicode strings. The results has been verified with Fsum Frontend 1.5.5.1. Radix Conversion: The radix conversion is based on the following sequence of chars: 10 [0..9] + 26 [A..Z] + 26 [a..z] + 33 [А..Я] + 33 [а..я].  The "0-9" digits and "A-Z" english letters...
 
amando:

mal eine kurze frage,


wie baut ihr euch die Abfrage in die OnTick ein damit man über mehr Pairs drübersehen kann?

die Pairs würde ich aus einem Array auswählen


Ich hatte früher mal einen ArbitrageTrader gebaut.

Dort wurden eine große Liste von Symbolen verarbeitet.

Hier die Funktion um es über L2 Daten Event zu machen . Nur wenn dein Broker L2 ( OrderBuch) anbietet.

Das kannst du leicht abwandeln und in OnTick() einbauen

void OnBookEvent(const string &symbol)
  {
   cTimer[0].start("OnBookEvent");
   OnBookEvent_Counter++;
  
   //Sleep(5);
   double l_price[3]        = {0,0,0};  
   double s_price[3]        = {0,0,0};

   
   bool FOUND            = false;
   //MarketBookGet(symbol,book);
   
   
  // ringnumber = GetRingNumber(symbol);
  
  
   
   for(int i = 0; i < RingNum ; i ++)      
    {
        for(int x = 0; x < 3  ; x++)
        {      
          if(symbol == Ring[i][x])
            {

                  
                    MqlTick newTick ;
                    ZeroMemory(newTick);
                    
                 
                    FOUND = true;
                    for(int y = 0; y < 3; y++)
                    {
                
                      SymbolInfoTick(Ring[i][y],newTick);
                                                                      
                      if(y == 0)
                      {
                          l_price[y] = newTick.ask ;
                          s_price[y] = newTick.bid ;
                          
                      }
                      else
                      {
                          l_price[y] = newTick.bid ;
                          s_price[y] = newTick.ask ;
                      }
             
                    }
                 
                 checkCurrentPosition(FPI,RP_Ticket,RP_Profit);
                    
                 FPI[i][0] = l_price[0] / (l_price[1] * l_price[2]);                      // Calc FPI                 
                 if(FPI[i][0] < lFPI_open && (cA.MarginLevel() > SafeMarginLevel) == true && EnableTrade == true && R_ringHaveOrder(i) == false)
                  {
                    O_openRing(0, i, l_price, FPI[i][0], Ring, MagicNumber, BaseLots);              
                  }
                             
                 if(FPI[i][1] == 0 || FPI[i][0] < FPI[i][1])      FPI[i][1] = FPI[i][0];  // Save HI and LOW 
                 
                 
                 
                 
                 FPI[i][2] = s_price[0] / (s_price[1] * s_price[2]);                      // Calc FPI
                 if(FPI[i][2] > sFPI_open && (cA.MarginLevel() > SafeMarginLevel) && EnableTrade && !R_ringHaveOrder(i) )
                   {
            
                    O_openRing(1, i, s_price, FPI[i][2], Ring, MagicNumber, BaseLots);
                
                   }
                 
                 if(FPI[i][3] == 0 || FPI[i][2] > FPI[i][3])  FPI[i][3] = FPI[i][2];      // Save HI and LOW 
                 
                 int digit = 7;
                 string prefix = "fpi_body_row_";
                 string row = "", col = "";

                // row = IntegerToString(i);

                // D_setTextObj(prefix + row + "_col_4", DoubleToString(FPI[i][0], digit), DeepSkyBlue);
                
                // D_setTextObj(prefix + row + "_col_6", DoubleToString(FPI[i][2], digit), DeepSkyBlue);
                
                // if(_fpi[i][4] > 0)
                //   D_setTextObj(prefix + row + "_col_8", DoubleToString(FPI[i][4], digit), C'0xe6,0xdb,0x74');
                // else
                // D_setTextObj(prefix + row + "_col_8", DoubleToString(FPI[i][4], digit));
                // if(_fpi[i][5] > 0)
                // D_setTextObj(prefix + row + "_col_9", DoubleToString(FPI[i][5], digit), C'0xe6,0xdb,0x74');
                // else
                // D_setTextObj(prefix + row + "_col_9", DoubleToString(FPI[i][5], digit));
  
                 
                 
                    
           }
       }    
    }
  
  cTimer[0].stop_SaveToList(100);
  //D_setTextObj("fpi_header",">>>Rings(" + IntegerToString(RingNum) + ") & FPI <<< UpDateTime: "+cTimer[0].Print_Avg_List()/1000+" CNT: " + OnBookEvent_Counter );
  //ChartRedraw();
  //cTimer[0].stop_Text_Out();
  OnBookEvent_Processed++;
  }

Ein Ring besteht immer aus 3 Symbolen .

Der Vorteil war das man da quasi eine OnTick() für JEDES Symbol in der Liste hatte.

Da diese Art von Strategie auf absolute Geschwindigkeit ausgelegt ist.

Kann auch den gesammten EA posten wenn gewünscht.


Das sind die Strukturen dazu :

/*
 * Define Global Varables
 *
 */
string  Ring[][3];
int     RingNum;
double  FPI[][7];
int     orderTableHeaderX[10] = {760, 790, 855, 920, 985, 1060, 1130, 1200, 1270, 1330};

string FixList[34] = {"AUDCAD","AUDUSD","AUDCHF","AUDJPY","AUDNZD","CADCHF","CADJPY","CHFJPY","EURUSD","EURCAD","EURAUD","EURJPY","EURGBP","EURCHF","EURNZD",
                     "EURTRY","GBPAUD","GBPCAD","GBPUSD","GBPCHF","GBPUSD","GBPCHF","GBPJPY","GBPNZD","NZDCAD","NZDCHF","NZDJPY","NZDUSD","USDCAD","USDCHF",
                     "USDTRY","USDMXN","USDJPY","USDCNH"};
string FixList1[34] = {"AUDCAD","AUDUSD","AUDCHF","AUDJPY","AUDNZD","CADCHF","CADJPY","CHFJPY","EURUSD","EURCAD","EURAUD","EURJPY","EURGBP","EURCHF","EURNZD",
                     "EURTRY","GBPAUD","GBPCAD","GBPUSD","GBPCHF","GBPUSD","GBPJPY","GBPNZD","NZDCAD","NZDCHF","NZDJPY","NZDUSD","USDCAD","USDCHF",
                     "USDJPY"};                     


int    RP_Ticket[100][5]; //-- ringindex, a, b, c, direction
double RP_Profit[100][6]; //-- total, a, b, c, target, ringfpi
bool   RP_Status[100][4]; //-- flat, ordersend, activ, error
 
Christian:

Ich hatte früher mal einen ArbitrageTrader gebaut.

Dort wurden eine große Liste von Symbolen verarbeitet.

Hier die Funktion um es über L2 Daten Event zu machen . Nur wenn dein Broker L2 ( OrderBuch) anbietet.

Das kannst du leicht abwandeln und in OnTick() einbauen

Ein Ring besteht immer aus 3 Symbolen .

Der Vorteil war das man da quasi eine OnTick() für JEDES Symbol in der Liste hatte.

Da diese Art von Strategie auf absolute Geschwindigkeit ausgelegt ist.

Kann auch den gesammten EA posten wenn gewünscht.


Das sind die Strukturen dazu :

Danke Christian, 

das ist ja was ich suche, nur wollte ich ja quasi, die FixList als variable List haben, die Symbole anhand der Einträge in einer Datei sucht. Ich seh mir das mal genauer an

 
amando:

Danke Christian, 

das ist ja was ich suche, nur wollte ich ja quasi, die FixList als variable List haben, die Symbole anhand der Einträge in einer Datei sucht. Ich seh mir das mal genauer an

Du möchtest eine Datei einlesen in der Symbole stehen ?

Und das in jedem Tick ?

Die dann in dem array landen ?

Ist das nicht sinvoller ...


uint  FileWriteArray(
   int          file_handle,         // File handle
   const void&  array[],             // Array
   int          start=0,             // Start index in the array
   int          count=WHOLE_ARRAY    // Number of elements
   );

uint  FileReadArray(
   int    file_handle,               // File handle
   void&  array[],                   // Array to record
   int    start=0,                   // start array position to write
   int    count=WHOLE_ARRAY          // count to read
   );

?

 

Übrigens gibt die konstante Variable

_Symbol

immer das Symbol zurück worauf der EA gestartet wurde.

In deinem Beispiel wird das nicht funktionieren.

 
Christian:

Übrigens gibt die konstante Variable

immer das Symbol zurück worauf der EA gestartet wurde.

In deinem Beispiel wird das nicht funktionieren.

getestet hab ichs noch nicht, aber ich denke, so könnte das gehen

   for(int i=0;i<ArraySize(lines);i++)
     {

      MqlTick last_tick;                                       // für alle Symbole in der Datei
      if(!SymbolInfoTick(lines[i],last_tick)) Print("Error in Tick information ",lines[i]," Error ",GetLastError());

      //Print("Symbol: ",lines[i]," tick.bid: ",last_tick.bid);

      // Break Even Line verwenden
      if(PositionSelect(lines[i]))
        {
         if(ObjectFind(0,"BreakEvenLine"+lines[i]))
           {
            for(int j=0; j<CountPositionsLong(lines[i],MN);j++)
              {
               if(last_tick.ask>=ObjectGetValueByTime(0,"BreakEvenLine"+lines[i],TimeCurrent(),OBJ_TREND))
                 {
                  BreakEvenExpertLong(lines[i],MN);  // hier die BreakEven Funktion
                 }
              }
            for(int j=0; j<CountPositionsShort(lines[i],MN);j++)
              {
               if(last_tick.bid<=ObjectGetValueByTime(0,"BreakEvenLine"+lines[i],TimeCurrent(),OBJ_TREND))
                 {
                  BreakEvenExpertShort(lines[i],MN);  // hier die BreakEven Funktion
                 }
              }
           }
        }
     }

in den Array lines hab ich die Symbole reingeladen, und für die BE Funktion geht er halt die Symbole durch, sieht ob eine BE_Line vorhanden ist, wenn der Kurs dann passt sollte er die Positionauf BE setzten

Grund der Beschwerde: