bifurcado de zjwzjw20062007/MQL5Book
		
	
		
			
	
	
		
			128 líneas
		
	
	
	
		
			4,6 KiB
		
	
	
	
		
			MQL5
		
	
	
	
	
	
		
		
			
		
	
	
			128 líneas
		
	
	
	
		
			4,6 KiB
		
	
	
	
		
			MQL5
		
	
	
	
	
	
| 
								 | 
							
								//+------------------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								//|                                                SymbolTickSpy.mq5 |
							 | 
						||
| 
								 | 
							
								//|                                  Copyright 2022, MetaQuotes Ltd. |
							 | 
						||
| 
								 | 
							
								//|                                             https://www.mql5.com |
							 | 
						||
| 
								 | 
							
								//+------------------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								#property copyright   "2022, MetaQuotes Ltd."
							 | 
						||
| 
								 | 
							
								#property link        "https://www.mql5.com"
							 | 
						||
| 
								 | 
							
								#property description "Send custom events to specified chart upon receiving new ticks on symbols from a list. "
							 | 
						||
| 
								 | 
							
								                      "Fill MqlTick structures with price/volume data on every tick.\n"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#property indicator_chart_window
							 | 
						||
| 
								 | 
							
								#property indicator_plots 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define TICKSPY 0xFEED // 65261
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								input string SymbolList = 
							 | 
						||
| 
								 | 
							
								   "EURUSD,GBPUSD,XAUUSD,USDJPY,USDCHF"; // List of symbols, comma separated (example)
							 | 
						||
| 
								 | 
							
								input ushort Message = TICKSPY;          // Custom message id
							 | 
						||
| 
								 | 
							
								input long Chart = 0;                    // Receiving chart id (do not edit)
							 | 
						||
| 
								 | 
							
								input int Index = 0;                     // Index in symbol list (do not edit)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								string Symbols[];
							 | 
						||
| 
								 | 
							
								int Spreads[];
							 | 
						||
| 
								 | 
							
								int SelfIndex = -1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//+------------------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								//| Custom indicator initialization function                         |
							 | 
						||
| 
								 | 
							
								//+------------------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								void OnInit()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   PrintFormat("Starting for chart %lld, msg=0x%X [%s]", Chart, Message, SymbolList);
							 | 
						||
| 
								 | 
							
								   if(Chart == 0)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      if(StringLen(SymbolList) > 0)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         const int n = StringSplit(SymbolList, ',', Symbols);
							 | 
						||
| 
								 | 
							
								         ArrayResize(Spreads, n);
							 | 
						||
| 
								 | 
							
								         for(int i = 0; i < n; ++i)
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            if(Symbols[i] != _Symbol)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               ResetLastError();
							 | 
						||
| 
								 | 
							
								               // run this indicator on different symbols with different settings,
							 | 
						||
| 
								 | 
							
								               // specifically we pass ChartID to get notifications back from other symbols
							 | 
						||
| 
								 | 
							
								               iCustom(Symbols[i], PERIOD_CURRENT, MQLInfoString(MQL_PROGRAM_NAME),
							 | 
						||
| 
								 | 
							
								                  "", Message, ChartID(), i);
							 | 
						||
| 
								 | 
							
								               if(_LastError != 0)
							 | 
						||
| 
								 | 
							
								               {
							 | 
						||
| 
								 | 
							
								                  PrintFormat("The symbol '%s' seems incorrect", Symbols[i]);
							 | 
						||
| 
								 | 
							
								               }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               SelfIndex = i;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            Spreads[i] = 0;
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         Print("SymbolList is empty: tracking current symbol only!");
							 | 
						||
| 
								 | 
							
								         Print("To monitor other symbols, fill in SymbolList, i.e. 'EURUSD,GBPUSD,XAUUSD,USDJPY'");
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//+------------------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								//| Custom indicator iteration function                              |
							 | 
						||
| 
								 | 
							
								//+------------------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								int OnCalculate(const int rates_total, const int prev_calculated, const int, const double &price[])
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   if(prev_calculated)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      if(Chart > 0)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         // send tick notification to requesting chart
							 | 
						||
| 
								 | 
							
								         EventChartCustom(Chart, Message, Index, 0, NULL);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else if(SelfIndex > -1)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         OnSymbolTick(SelfIndex);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								   return rates_total;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//+------------------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								//| Chart event handler                                              |
							 | 
						||
| 
								 | 
							
								//+------------------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   if(id == CHARTEVENT_CUSTOM + Message)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      OnSymbolTick((int)lparam);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//+------------------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								//| Multisymbol tick custom event                                    |
							 | 
						||
| 
								 | 
							
								//+------------------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								void OnSymbolTick(const int index)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   const string symbol = Symbols[index];
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								   MqlTick tick;
							 | 
						||
| 
								 | 
							
								   if(SymbolInfoTick(symbol, tick))
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      Spreads[index] = (int)MathRound((tick.ask - tick.bid)
							 | 
						||
| 
								 | 
							
								         / SymbolInfoDouble(symbol, SYMBOL_POINT));
							 | 
						||
| 
								 | 
							
								         
							 | 
						||
| 
								 | 
							
								      string message = "";
							 | 
						||
| 
								 | 
							
								      for(int i = 0; i < ArraySize(Spreads); ++i)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         message += Symbols[i] + "=" + (string)Spreads[i] + "\n";
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      Comment(message);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//+------------------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								//| Finalization handler                                             |
							 | 
						||
| 
								 | 
							
								//+------------------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								void OnDeinit(const int)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   Comment("");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								//+------------------------------------------------------------------+
							 |