Как правильно обновить пользовательский символ?

 
Hi, Can anyone help me with a custom character? I have a socket-based api that gives me Time, OHLC, Volum, ASK, Bid. But I get strange results. How can I properly update a custom character?

Here is the code I'm trying to use.

ClientSocket * glbSocket; 

glbSocket = new ClientSocket ( "127.0.0.1" , 7777); 
// Print (glbSocket.IsSocketConnected ()); 
if (! glbSocket.IsSocketConnected ()) { 
Print ( "Failed to connect" ); 
Print ( "No:" , GetLastError ()); 
} 
if (glbSocket. IsoSocketConnected ()) { 

if (glbSocket. Send ( "e" )) Print ( "YES" ); 
Sleep ( 100 ); 
string output = glbSocket.Receive (); 

// Print ("T");
// Print (output); 

MqlDateTime t; 
MqlTick ticks_array [ 1 ]; 
MqlRates rates_add [ 1 ]; 
string split []; 
int store = StringSplit (output, ',' , split); 

TimeToStruct (( datetime ) ( int ) split [ 0 ], t); 
string tt = IntegerToString (t.year) + "." + IntegerToString (t.mon) + "." + IntegerToString (t.day) + "" + IntegerToString (t.hour) +":" + IntegerToString (t.min) + ":" + "00" ; 
Print (store); 
Print (tt); 



ticks_array [ 0 ] .bid = StringToDouble (split [ 6 ]); 
ticks_array [ 0 ] .ask = StringToDouble (split [ 7 ]); 

ticks_array [ 0 ] .last = StringToDouble (split [ 4 ]); 
ticks_array [ 0 ] .flags = TICK_FLAG_BID ; 
ticks_array [ 0 ] .time = ( datetime ) ( inta) split [ 0 ]; // StringToTime ((int) (split [0])); 
ticks_array [ 0 ] .volume = StringToInteger (split [ 5 ]); 
//ticks_array[0[.volume = (long) (split [5]); 

ticks_array [ 0 ] .time_msc = 0 ; // (long) sec_milli [1]; 

// ---> add tick

 rates_add [ 0 ] .time = StringToTime (tt); 
rates_add [ 0 ] .open = StringToDouble (split [ 1 ]); 
rates_add [ 0 ] .high = StringToDouble (split [ 2 ]); 
rates_add [ 0] .low = StringToDouble (split [ 3 ]); 
rates_add [ 0 ] .close = StringToDouble (split [ 4 ]); 
rates_add [ 0 ] .spread = ( int ) (( StringToDouble (split [ 7 ]) - StringToDouble (split [ 6 ])) * 100000 ); 
//rates_add[0001.real_volume = (long) (split [5]); 
//rates_add[0.l.tick_volume = 0; // (long) (split [5]); 

CustomTicksAdd (symbol_custom, ticks_array); 
Print ( CustomRatesUpdate (symbol_custom, rates_add)); 
Print (store);
ArrayPrint (split); 

} 
delete glbSocket;


 

Пожалуйста, помогите мне.

 

Попробуйте через CopyTicks получить несколько MqlTick. А затем по одному добавить их в кастомный символ.

Тогда код значительно станет проще. И появится больше понимания, как работать с кастомными символами.

 
fxsaber :

Try using CopyTicks to get a few MqlTick . And then add them one by one to the custom symbol.

Then the code will become much easier. And there will be more understanding of how to work with custom characters.

Спасибо, мой друг. Я сомневаюсь. В чем разница в использовании MqlTick и MqlRates? Если я использую либо, какой из них правильный для пользовательских символов? Кроме того, есть ли какой-либо пример, который вы можете разделить со мной отдельно от примера третьих сторон, который вы уже закодировали? Простой пример.

 
jaffer wilson:

Спасибо, мой друг. Я сомневаюсь. В чем разница в использовании MqlTick и MqlRates? Если я использую либо, какой из них правильный для пользовательских символов? Кроме того, есть ли какой-либо пример, который вы можете разделить со мной отдельно от примера третьих сторон, который вы уже закодировали? Простой пример.

Прочтите внимательно Документацию. При добавлении тика автоматически генерируются бары. Их добавлять не нужно.

Пример

#include <Symbol.mqh> // https://www.mql5.com/ru/code/18855

void OnStart()
{
  const SYMBOL Symb("TEST_" + _Symbol);

  if (Symb.IsExist() && Symb.On())
  {        
    Symb.CloneProperties();

    MqlTick Ticks[];
    
    const int Amount = CopyTicks(_Symbol, Ticks);

    for (int i = 0; i < Amount; i++)
    {
      MqlTick Tick[1];
      
      Tick[0] = Ticks[i];
      
      CustomTicksAdd(Symb.Name, Tick);      
    }        
  }
}
Documentation on MQL5: Custom Symbols / CustomTicksAdd
Documentation on MQL5: Custom Symbols / CustomTicksAdd
  • www.mql5.com
[in]   An array of tick data of the MqlTick type arranged in order of time from earlier data to more recent ones, i.e. ticks[k].time_msc <= ticks[n].time_msc, if k<n. function only works for custom symbols opened in the Market Watch window. If the symbol is not selected in Market Watch, then you should add ticks using CustomTicksReplace...