[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 61

 

Caros especialistas, por favor, respondam à pergunta:

MetaEditor tem arquivos de texto de modelos de criação de programas. Eles são usados pelo feiticeiro ao criar um programa. No texto do modelo são especificados os parâmetros do tipo do arquivo do programa criado. Há tags entre eles parâmetros que não são exibidos no texto do código. Mas o terminal os reconhece de alguma forma. Se for criado um Expert Advisor, a função Start é lançada após o próximo tick. Se for criado um indicador, a função Start é lançada sem um tick. Para onde vão as etiquetas e tudo nelas?

 

Fiz mais dois testes para ver de onde tudo isso vem:


1. eu li a partir do ini não em uma série de cordas, mas em variáveis separadas. O resultado é o esperado, ou seja, a cópia não é um valor, mas uma referência:

int    numCross=0;

string Cross_1="-", Cross_2="-", Cross_3="-";
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  string sectionName = "common";
  
  numCross = ReadIniInteger( config_path, sectionName, "numCross", 0);
  ArrayResize( CrossName, numCross);
  for (int i=0; i<numCross; i++) CrossName[i] = "-";
  
  sectionName = "cross1";
  Cross_1 = ReadIniString( config_path, sectionName, "name", "-");
  Print("init.1: Cross_1=", Cross_1);
  sectionName = "cross2";
  Cross_2 = ReadIniString( config_path, sectionName, "name", "-");
  Print("init.1: Cross_2=", Cross_2);
  sectionName = "cross3";
  Cross_3 = ReadIniString( config_path, sectionName, "name", "-");
  Print("init.1: Cross_3=", Cross_3);
  Print("init.1: read complete");

  Print("init.2: Cross_1=", Cross_1);
  Print("init.2: Cross_2=", Cross_2);
  Print("init.2: Cross_3=", Cross_3);
  Print("-------------------------------");
  
  sectionName = "cross1";
  Cross_1 = StringSubstr( ReadIniString( config_path, sectionName, "name", "-"), 0, 0);
  Print("init.3: Cross_1=", Cross_1);
  sectionName = "cross2";
  Cross_2 = StringSubstr( ReadIniString( config_path, sectionName, "name", "-"), 0, 0);
  Print("init.3: Cross_2=", Cross_2);
  sectionName = "cross3";
  Cross_3 = StringSubstr( ReadIniString( config_path, sectionName, "name", "-"), 0, 0);
  Print("init.3: Cross_3=", Cross_3);
  Print("init.3: read complete");

  Print("init.4: Cross_1=", Cross_1);
  Print("init.4: Cross_2=", Cross_2);
  Print("init.4: Cross_3=", Cross_3);

  return(0);
}


o resultado obtido:

2009.04.10 14:31:42 example AUDUSD,H4: init.4: Cross_3=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.4: Cross_2=GBPUSD
2009.04.10 14:31:42 example AUDUSD,H4: init.4: Cross_1=EURUSD
2009.04.10 14:31:42 example AUDUSD,H4: init.3: read complete
2009.04.10 14:31:42 example AUDUSD,H4: init.3: Cross_3=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.3: Cross_2=GBPUSD
2009.04.10 14:31:42 example AUDUSD,H4: init.3: Cross_1=EURUSD
2009.04.10 14:31:42 example AUDUSD,H4: -------------------------------
2009.04.10 14:31:42 example AUDUSD,H4: init.2: Cross_3=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.2: Cross_2=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.2: Cross_1=USDJPY

2009.04.10 14:31:42 example AUDUSD,H4: init.1: read complete
2009.04.10 14:31:42 example AUDUSD,H4: init.1: Cross_3=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.1: Cross_2=GBPUSD
2009.04.10 14:31:42 example AUDUSD,H4: init.1: Cross_1=EURUSD


2. retornou o conjunto de cordas, mas em vez da leitura da função a partir dos valores das cordas ini

string ReadIniString(string FileName, string SectionName, string KeyName, 
                     string Default = "")
  {
   string ReturnedString = "";
   int nValue = GetPrivateProfileStringA( SectionName, KeyName, Default, 
                                          ReturnedString, 255, FileName);
   if( nValue > 0)
       return( ReturnedString);
   else 
       return( Default);
  }

usou uma função de teste, que não chama nada de win api

string CrossName[];
int    numCross=0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  string sectionName = "common";
  
  numCross = ReadIniInteger( config_path, sectionName, "numCross", 0);
  ArrayResize( CrossName, numCross);
  for (int i=0; i<numCross; i++) CrossName[i] = "-";
  
  for (int i=0; i< numCross; i++)
  {
    sectionName = StringConcatenate("cross", i+1);
    CrossName[ i] = someFunc( i+1);
    Print("init.1: CrossName[", ( i+1), "]=", CrossName[ i]);
  }
  Print("init.1: read complete");
  
  for ( i=0; i< numCross; i++)
  {
    Print("init.2: CrossName[", ( i+1), "]=", CrossName[ i]);
  }
  

  Print("-------------------------------");
  for ( i=0; i< numCross; i++)
  {
    sectionName = StringConcatenate("cross", i+1);
    CrossName[ i] = StringSubstr( someFunc( i+1), 0, 0);
    Print("init.3: CrossName[", ( i+1), "]=", CrossName[ i]);
  }
  Print("init.3: read complete");
  
  for ( i=0; i< numCross; i++)
  {
    Print("init.4: CrossName[", ( i+1), "]=", CrossName[ i]);
  }

  return(0);
}
//+------------------------------------------------------------------+
string someFunc(int val)
{
  string ReturnedString = "CROSS_"+ val;
  return( ReturnedString);
}
//+------------------------------------------------------------------+

resultado

2009.04.10 14:41:12 exemplo AUDUSD,H4: init.4: CrossName[3]=CROSS_3
2009.04.10 14:41:12 exemplo AUDUSD,H4: init.4: CrossName[2]=CROSS_2
2009.04.10 14:41:12 exemplo AUDUSD,H4: init.4: CrossName[1]=CROSS_1
2009.04.10 14:41:12 exemplo AUDUSD,H4: init.3
exemplo AUDUSD,H4: init.3: CrossName[3]=CROSS_3
2009.04.10 14:41:12 exemplo AUDUSD,H4: init.3: CrossName[2]=CROSS_2
2009.04.10 14:41:12 exemplo AUDUSD,H4: init.3CrossName[1]=CROSS_1
2009.04.10 14:41:12 exemplo AUDUSD,H4:


2009.04.10 14:41:12 exemplo AUDUSD,H4: init.2: CrossName[3]=CROSS_3 2009.04.10 14:41:12 exemplo AUDUSD,H4: init.2: CrossName[2]=CROSS_2
2009.04.10 14:41:12 exemplo AUDUSD,H4: init.2CrossName[1]=CROSS_1
2009.04.10 14:41:12 exemplo AUDUSD,H4: init.1: ler completo
2009.04.10 14:41:12 exemplo AUDUSD,H4: init.1: CrossName[3]=CROSS_3
2009.04.10 14:41:12 exemplo AUDUSD,H4: init.1: CrossName[2]=CROSS_2
2009.04.10 14:41:12 exemplo AUDUSD,H4: init.1: CrossName[1]=CROSS_1

mostrou que o problema parece estar na conversão de

LPTSTR lpReturnedString [out] Um ponteiro para o buffer que recebe a corda recuperada ganha api de GetPrivateProfileString fi  para corda mql4.
 
xruss >> :

Como deveria ser? Logicamente pensei em definir um tipo de ORD antes de um sinal ser formado. caso contrário, como será levado em conta nos critérios de negociação. e outro obstáculo - as posições não são abertas mesmo com um histórico vazio((

Respondeu em particular - acho que será mais produtivo desta forma.

 
Reshetov >> :

É muito mais fácil, não reinventar a roda, e pegar um dos Expert Advisors prontos, negociando no martingale e ver como ele já está implementado.


Por exemplo, o Universum 3.0.


Obrigado, eu concordo completamente - tudo foi inventado há muito tempo.

 

Execução da função init() ao testar EA no testador.


Eu quero normalizar algumas variáveis externas na função init() da EA

e usar estes valores normalizados para chamar o indicador desde o início().

Eu não quero incluir esta normalização no início().

A função init() será executada toda vez que uma variável externa for alterada durante a otimização da EA no testador de estratégia?
 
begemot61 писал(а) >>

Execução da função init() ao testar EA no testador.


Eu quero normalizar algumas variáveis externas na função init() da EA

e usar estes valores normalizados (novos) para chamar o indicador desde o início().

Eu não quero incluir esta normalização no início().

A função init() será executada toda vez que uma variável externa for alterada durante a otimização da EA no testador de estratégia?

Sim, será

 

int start()
{
if (OrdersTotal() == 0
&& TimeDayOfWeek(TimeCurrent()) == 5
&& TimeHour(TimeCurrent()) == 12
&& TimeMinute(TimeCurrent()) == 30
&& TimeSeconds(TimeCurrent()) >= 00)
{
Alert("Тра ляля");
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"sell",999999,0,Red);
}


Alguém pode me dizer por que uma ordem não abre aqui? O que eu estou fazendo de errado?
 
Dimoncheg писал(а) >>
Alguém tem alguma idéia por que uma ordem não está abrindo aqui? O que eu estou fazendo de errado?

Certo, este aqui... É preciso esperar até sexta-feira, se houver um tique dentro desse minuto, ele deverá abrir.

 
Roger >> :

Certo, este aqui... É preciso esperar até sexta-feira, se houver um tique dentro desse minuto, ele deverá abrir.

>> É isso mesmo, eu faço na sexta-feira ou em qualquer outro dia da semana e o alerta funciona e o pedido não abre de forma alguma.

Razão: