Wie erhalte ich eine Übersicht über die Handelsgeschäfte? Bisher spielt es keine Rolle, ob es sich um einen Indikator oder einen Expert Advisor handelt. Wenn wir periodisch (in OnTimer() oder in OnTick()) die Historie der Ticks durch CopyTicks erhalten, werden sie zum ArrayMqlTick hinzugefügt.
Eine einfache Analyse dieses Arrays wird jedoch keine Antwort auf die Frage geben, ob es neue Geschäfte gab oder nicht, da der Vergleich der Tickzeiten nicht immer korrekt ist, da es in einer Millisekunde mehrere Geschäfte geben kann:
Verwenden Sie das Ereignis onBookEvent() - es wird bei jeder Änderung des Marktes ausgelöst.
Wie erhalte ich eine Übersicht über die Handelsgeschäfte? Bisher spielt es keine Rolle, ob es sich um einen Indikator oder einen Expert Advisor handelt. Wenn wir periodisch (in OnTimer() oder in OnTick()) die Historie der Ticks durch CopyTicks erhalten, werden sie zum ArrayMqlTick hinzugefügt.
Eine einfache Analyse dieses Arrays wird jedoch keine Antwort auf die Frage geben, ob es neue Geschäfte gab oder nicht, da der Vergleich der Tickzeiten nicht immer korrekt ist, da es in einer Millisekunde mehrere Geschäfte geben kann:
Verwenden Sie das Ereignis onBookEvent(), es wird bei jeder Änderung des Kurses ausgelöst.
Der Cup ist, grob gesagt, ein "Tick-Chart-Twitch" - es handelt sich nicht unbedingt um eine Änderung in der Tabelle aller Trades.
Verwenden Sie die zweiten Abschnitte. Zum Beispiel, in MqlTick oder sogar in OnEvent kopieren Sie die neuen Ticks, die während der letzten Sekunde empfangen wurden, in das Array. Die Differenz zwischen dem vorherigen Wert und der aktuellen Größe des Arrays gibt die Anzahl der neuen Ticks an.
Eine Wette ist, grob gesagt, eine "Tick-Chart-Zuckung" - es handelt sich nicht unbedingt um eine Änderung in der Tabelle aller Abschlüsse.
Wenn man ein bisschen darüber nachdenkt, gibt es sicher alle Berufe.
Hier ist ein einfaches Beispiel für den All Trades Tape Indikator
//+------------------------------------------------------------------+ //| DealsLent.mq5 | //| Copyright 2016, prostotrader | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, prostotrader" #property link "https://www.mql5.com" #property version "1.00" input int Ticks = 100; //Тики #property indicator_separate_window #property indicator_buffers 2 #property indicator_plots 2 //--- plot Label1 #property indicator_label1 "Sell" #property indicator_type1 DRAW_LINE #property indicator_color1 clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot Label1 #property indicator_label2 "Buy" #property indicator_type2 DRAW_LINE #property indicator_color2 clrBlue #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- indicator buffers double SellBuffer[]; double BuyBuffer[]; double sell_deals; double buy_deals; long curr_time; int event_cnt; bool on_call; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { curr_time=0; if(!MarketBookAdd(Symbol())) { Print(__FUNCTION__,": Стакан символа "+Symbol()+" не добавден!"); return( INIT_FAILED ); } //--- Period if(Period()!=PERIOD_M1) { Print("Ошибка! Период графика должен быть 'M1'"); return( INIT_FAILED ); } //--- IndicatorSetInteger(INDICATOR_DIGITS,0); IndicatorSetString(INDICATOR_SHORTNAME,"DealsLent"); //--- SetIndexBuffer(0,SellBuffer,INDICATOR_DATA); PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); ArraySetAsSeries(SellBuffer,true); //--- SetIndexBuffer(1,BuyBuffer,INDICATOR_DATA); PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE); ArraySetAsSeries(BuyBuffer,true); //--- event_cnt=0; on_call=false; return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { MarketBookRelease(Symbol()); if(reason==REASON_INITFAILED) { int window=ChartWindowFind(ChartID(),"DealsLent"); ChartIndicatorDelete(ChartID(),window,"DealsLent"); } } //+------------------------------------------------------------------+ //| Custom indicator On book event function | //+------------------------------------------------------------------+ void OnBookEvent(const string &symbol) { MqlTick ticks[]; if(symbol==Symbol()) { if(curr_time==0) { if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,1)==1) { curr_time=ticks[0].time_msc; } } else { sell_deals= 0; buy_deals = 0; if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,Ticks)==Ticks) { for(int i=0; i<Ticks; i++) { if(ticks[i].time_msc!=curr_time) { if(( ticks[i].flags &TICK_FLAG_BUY)==TICK_FLAG_BUY) { buy_deals++; } else if(( ticks[i].flags &TICK_FLAG_SELL)==TICK_FLAG_SELL) { sell_deals++; } } } } curr_time=ticks[0].time_msc; double price[]; on_call=true; OnCalculate(event_cnt,event_cnt,0,price); } } } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { if(prev_calculated==0) { ArrayInitialize(SellBuffer,EMPTY_VALUE); ArrayInitialize(BuyBuffer,EMPTY_VALUE); } else { if(rates_total==event_cnt) { if(on_call) { on_call=false; //--- for(int i=rates_total-1; i>0; i--) { SellBuffer[i]= SellBuffer[i-1]; BuyBuffer[i] = BuyBuffer[i-1]; } SellBuffer[0]= double(sell_deals); BuyBuffer[0] = double(buy_deals); } } else { if(on_call) { on_call=false; SellBuffer[0]= double(sell_deals); BuyBuffer[0] = double(buy_deals); } else { SellBuffer[0]= SellBuffer[1]; BuyBuffer[0] = BuyBuffer[1]; } } } event_cnt=rates_total; //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
Wenn man ein bisschen darüber nachdenkt, gibt es sicher alle Berufe.
Hier ist ein einfaches Beispiel für den All Trades Ribbon Indikator
Die Ausführung ist fehlgeschlagen:
2016.08.24 15:54:41.700 DealsLent (RTS-12.16,M1) array out of range in 'DealsLent.mq5' (118,25)

Der Start ist fehlgeschlagen:
void OnBookEvent(const string &symbol)
{
MqlTick ticks[];
if(symbol==Symbol())
{
if(curr_time==0)
{
if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,1)==1)
{
curr_time=ticks[0].time_msc;
}
}
else
{
sell_deals= 0;
buy_deals = 0;
if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,Ticks)==Ticks)
{
for(int i=0; i<Ticks; i++)
{
if(ticks[i].time_msc!=curr_time)
{
if(( ticks[i].flags &TICK_FLAG_BUY)==TICK_FLAG_BUY)
{
buy_deals++;
}
else
if(( ticks[i].flags &TICK_FLAG_SELL)==TICK_FLAG_SELL)
{
sell_deals++;
}
}
}
curr_time=ticks[0].time_msc;
double price[];
on_call=true;
OnCalculate(event_cnt,event_cnt,0,price);
}
}
}
}
Eine Wette ist, grob gesagt, eine "Tick-Chart-Zuckung" - es handelt sich nicht unbedingt um eine Änderung in der Tabelle aller Abschlüsse.
Machen Sie etwas wie eine Maske tun: 0-1-0-1, und wenn die Maske ist stabil mit etwa fünf und zehn Zeilen - es bedeutet eine garantierte Übereinstimmung?Karputow Wladimir
Ein voll funktionsfähiger "All Trades Feed" Indikator
//+------------------------------------------------------------------+ //| DealsLent.mq5 | //| Copyright 2016, prostotrader | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, prostotrader" #property link "https://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 2 #property indicator_plots 2 //--- plot Label1 #property indicator_label1 "Sell" #property indicator_type1 DRAW_LINE #property indicator_color1 clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot Label1 #property indicator_label2 "Buy" #property indicator_type2 DRAW_LINE #property indicator_color2 clrBlue #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- indicator buffers double SellBuffer[]; double BuyBuffer[]; double sell_deals; double buy_deals; ulong start_time; int event_cnt; bool on_call; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { start_time=0; if(!MarketBookAdd(Symbol())) { Print(__FUNCTION__,": Стакан символа "+Symbol()+" не добавден!"); return( INIT_FAILED ); } //--- Bars int bars=Bars(Symbol(),PERIOD_CURRENT); if (bars<3) { Print(__FUNCTION__,": Не достаточно баров на текущем таймфрейме!"); return( INIT_FAILED ); } //--- IndicatorSetInteger(INDICATOR_DIGITS,0); IndicatorSetString(INDICATOR_SHORTNAME,"DealsLent"); //--- SetIndexBuffer(0,SellBuffer,INDICATOR_DATA); PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); ArraySetAsSeries(SellBuffer,true); //--- SetIndexBuffer(1,BuyBuffer,INDICATOR_DATA); PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE); ArraySetAsSeries(BuyBuffer,true); //--- event_cnt=0; on_call=false; return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { MarketBookRelease(Symbol()); if(reason==REASON_INITFAILED) { int window=ChartWindowFind(ChartID(),"DealsLent"); ChartIndicatorDelete(ChartID(),window,"DealsLent"); } } //+------------------------------------------------------------------+ //| Custom indicator On book event function | //+------------------------------------------------------------------+ void OnBookEvent(const string &symbol) { MqlTick ticks[]; if(symbol==Symbol()) { if(start_time==0) { if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,1)==1) { start_time=ulong(ticks[0].time_msc); } } else { sell_deals= 0; buy_deals = 0; int copied= CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,start_time,0); if(copied>0) { for(int i=0; i<copied; i++) { if(( ticks[i].flags &TICK_FLAG_BUY)==TICK_FLAG_BUY) { buy_deals++; } else if(( ticks[i].flags &TICK_FLAG_SELL)==TICK_FLAG_SELL) { sell_deals++; } } start_time=ulong(ticks[copied - 1].time_msc); double price[]; on_call=true; OnCalculate(event_cnt,event_cnt,0,price); } } } } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { if(prev_calculated==0) { ArrayInitialize(SellBuffer,EMPTY_VALUE); ArrayInitialize(BuyBuffer,EMPTY_VALUE); } else { if(rates_total==event_cnt) { if(on_call) { on_call=false; //--- for(int i=rates_total-1; i>0; i--) { SellBuffer[i]= SellBuffer[i-1]; BuyBuffer[i] = BuyBuffer[i-1]; } SellBuffer[0]= double(sell_deals); BuyBuffer[0] = double(buy_deals); } } else { if(on_call) { on_call=false; SellBuffer[0]= double(sell_deals); BuyBuffer[0] = double(buy_deals); } else { SellBuffer[0]= SellBuffer[1]; BuyBuffer[0] = BuyBuffer[1]; } } } event_cnt=rates_total; //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
Karputow Wladimir
Ein voll funktionsfähiger "All Trades Feed" Indikator
- 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.

Wie erhalte ich eine Übersicht über die Handelsgeschäfte? Bisher spielt es keine Rolle, ob es sich um einen Indikator oder einen Expert Advisor handelt. Wenn wir periodisch (in OnTimer() oder in OnTick()) die Historie der Ticks durch CopyTicks erhalten, werden sie zum ArrayMqlTick hinzugefügt.
Eine einfache Analyse dieses Arrays wird jedoch keine Antwort auf die Frage geben, ob es neue Geschäfte gab oder nicht, da der Vergleich der Tickzeiten nicht immer korrekt ist, da es in einer Millisekunde mehrere Geschäfte geben kann: