Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 829

 
No mt5, quando se testa carraças reais, a comissão conta lá, ou apenas o spread?
 

O perito multi-divisas no laço pede dados por símbolo. Existe um tal fragmento:

      int gtc1 = GetTickCount();
      res_copy_buf = CopyBuffer(handle, 0, 0, bars_calc, Buf_01); 
      int gtc2 = GetTickCount();

Todos os símbolos passam normalmente. Durante a primeira passagem o tempo é de cerca de 120ms, porque os amortecedores indicadores estão a encher. A partir da segunda passagem de cálculo na barra actual, o tempo de cálculo é inferior a 1 ms.

Peculiaridade é que um corretor conhecido tem o símbolo EURRUR, para o qual não há dados ("Wait for update"). Por conseguinte, o cálculo fica preso nesta linha durante 51 segundos. Erro 4806. 51 segundos é inaceitável mesmo por uma (primeira) vez, e muito menos por um ciclo.

Pergunta. Como é que descubro rapidamente que não existem dados para uma determinada personagem? Eu memorizaria então e nas iterações subsequentes passaria por cima dele e continuaria sem perder o ritmo.

 

Colegas, por favor aconselhem como converter um conjunto de tipo duplo em cordel. Preciso de o escrever para um ficheiro. Aqui está um código de formação geral.

void OnStart()
{

double ar[];               // Массив
ArrayResize(ar,2);         // Подготовка массива
int i, Size=ArraySize(ar); // стартовое количество элементов

ar[0]=1;                   // Установка значений 2-х элементов массива
ar[1]=2; 

ArrayResize(ar,3); // Увеличение размера массива
ar[2]=3;           // Установка значения новому элементу массива
ArrayResize(ar,4); // Увеличение размера массива
ar[3]=4;           // Установка значения новому элементу массива
ArrayResize(ar,5); // Увеличение размера массива
ar[4]=5;           // Установка значения новому элементу массива
ArrayResize(ar,6); // Увеличение размера массива
ar[5]=6;           // Установка значения новому элементу массив
ArrayResize(ar,7); // Увеличение размера массива
ar[6]=7;           // Установка значения новому элементу массив
Size=ArraySize(ar);// новое количество элементов
ArraySetAsSeries(ar,true); // Смена направления индексации


//--- запись в файл


SaveArrayToFile ("s_ar", ar);
return;
}


bool SaveArrayToFile(string FileName, string  &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_WRITE|FILE_ANSI|FILE_TXT);
   if(h==-1){Alert(" ошибка открытия файла в ф-ии "); return(false);} // Ошибка открытия файла
   
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
 

Informação retirada do artigo

Salvar e carregar matrizes a partir de um ficheiro

Ao guardar e carregar um array de um ficheiro, devemos considerar a diferença na primeira dimensão do tamanho do array e o número total dos seus elementos. Ao guardar um array, deve primeiro escrever o tamanho do array (o número total de elementos determinado pelo ArraySize()) no ficheiro, depois o array inteiro:

bool SaveArrayToFile(string FileName,string &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_TXT|FILE_WRITE);
   if(h==-1) return(false); // Ошибка открытия файла
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
  }
 

Olá, estou a enfrentar o seguinte problema.

Tenho dois EAs para o mesmo instrumento com magiks diferentes, respectivamente. Eu ponho o meu magik através do CTrade e abro uma posição também através do CTrade. Quando tenho uma posição aberta da primeira EA, o seu magik é atribuído à segunda EA (ver abaixo), por isso a verificação de posições abertas não vê o meu magik e eu abro muitas posições numa direcção. A conta está numa demonstração, isto não pode ser detectado no testador. Se o valor do magik for salvo na classe, talvez deva ser zerado, mas não sei como.

int OnInit()
  {    
  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
   return(INIT_SUCCEEDED);
}
открываю позицию соответственно тоже через CTrade:
 if(SellCount()>0 || BuyCount()>0)
           {
            Print("Уже есть позиция на продажу !!!");
            return; // не добавлять к открытой позиции на покупку
           }
         SL=NormalizeDouble(latest_price.bid + STP*_Point,_Digits);
         TP=NormalizeDouble(latest_price.bid - TKP*_Point,_Digits);
         
         m_trade.Sell(lots1,_Symbol,0,SL,TP,"LaquerreOSC_MA_2.5.6.7 + 2");
         m_position.Select(_Symbol);
           {
            ulong myMagic=m_position.Magic();
            Print(" Открыта поза Селл с магиком № ",myMagic,", И спредом ",SymbolInfoInteger(_Symbol,SYMBOL_SPREAD));
           }
//+------------------------------------------------------------------+
int SellCount()//проверка рыночных ордеров на продажу
  {
   int count=0;
   for(int i=PositionsTotal()-1; i>=0;i--)
     {
      if(PositionSelect(_Symbol)==true)
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+

 
Pavel Nikiforov:

Olá, estou a enfrentar o seguinte problema.

Tenho dois EAs para o mesmo instrumento com magiks diferentes, respectivamente. Eu ponho o meu magik através do CTrade e abro uma posição também através do CTrade. Quando tenho uma posição aberta da primeira EA, o seu magik é atribuído à segunda EA (ver abaixo), por isso a verificação de posições abertas não vê o meu magik e eu abro muitas posições numa direcção. A conta está numa demonstração, isto não pode ser detectado no testador. Se o valor do magik for guardado na classe, talvez precise de ser zerado, mas não sei como.

Por favor,cole o código correctamente, não como uma folha de texto.


Quanto ao código: definir os parâmetros de entrada para cada EA com o seu próprio magik. Digamos que o primeiro é 10001, depois o segundo é 10002.

 
Vladimir Karputov:

Por favorinsira o código correctamente, não como uma folha de texto.


Quanto ao código: definir os parâmetros de entrada para cada EA com a sua própria magia. Suponhamos que o primeiro é fixado em 10001, depois o segundo em 10002.

Obrigado por uma resposta tão breve. Mas esse é o ponto, as magias são diferentes. Assim, determinei que o segundo robô abra posições com o primeiro mágico. Não sei como acontece e onde ele guarda o primeiro número mágico da EA, mas gostaria de descobrir.

 
Pavel Nikiforov:

Obrigado pela resposta rápida. Mas a questão é essa, os mágicos são diferentes. Então descobri que o segundo robô está a abrir posições com o número mágico do primeiro. Não sei como acontece e onde ele guarda o primeiro número de mágico, mas gostaria de descobrir.

Neste caso, é melhor definir o magik

  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
antes de cada abertura de posição/ordem em vez de no OnInit.
 
Alexey Viktorov:

Neste caso, é melhor especificar um magik

antes de cada abertura de posição, não no OnInit.

Neste caso, não é "melhor", é exactamente o que se precisa - é uma classe de embalagem para funções comerciais normais. Não armazena múltiplos magiks. É por isso que deve ser colocado um magik cada vez antes e quando se quer abrir uma posição com um novo magik.

Geralmente a sequência é a seguinte:

  • as posições devem ser abertas com magia 1 - definimos magia 1 e as posições subsequentes terão magia 1,
  • é necessário abrir posições com um Mágico 2 - criamos o Mágico 2 e todas as posições seguintes terão um Mágico 2,
  • é necessário abrir posições com a magia 3 - vamos criar a magia 3 e cada posição seguinte terá a magia 3,

etc....

 
Alexey Viktorov:

Neste caso, é melhor definir um magik

Antes de cada abertura de uma posição/ordem, e não no OnInit.

Originalmente era assim, não ajuda. Mas em exemplos, é normalmente no OnInit que se moveu. Há muito tempo que ando a mexer nisto, as corujas no teste parecem estar a correr bem, depois de repente abro o servidor e há 20 posições numa direcção. O facto de a verificação das posições em aberto não poder ser feita através das aulas?

 
Pavel Nikiforov:

Obrigado pela resposta rápida. Mas a questão é essa, os mágicos são diferentes. Então descobri que o segundo robô está a abrir posições com o número mágico do primeiro. Não sei como acontece e onde ele guarda primeiro o número mágico da EA, mas quero descobrir.

Uma vez que não existe o métodoGetExpertMagicNumber na classe CTrade, por favor imprima este código após a operação comercial:

Print("Expert name: ",__FILE__,", magic: ",IntegerToString(m_trade.RequestMagic());

Desta forma, pode verificar se ambos os EAs têm magias diferentes.