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:
- int hash = (int)Hash_adler32(mySym);
- int idx = ArrayBSearch(ArrrayOfHash_Idx,hash) ;
- if ( !SymbolinfoTick(mySym,ArrayMqlTicks[idx] ) Print(_LastError);
- www.mql5.com
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
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
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
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
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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 habs auch schon mit + probiert
bin mir sicher da gibts einen Trick
danke
amando