Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 930

 

DiPach , obrigado novamente por sua ajuda. Analisei seus exemplos. Fiz algumas mudanças no meu código de inicialização. O resultado é este:

void OnStart()
  {
int awd1[];
ArrayResize(awd1,6,7);
   for(int i=0;i<=5;i++)
   {
   awd1[i]=i+10;
   Print("awd1[", i, "]=", awd1[i]);
   }
   Alert("awd1[0]=", awd1[0], ", awd1[1]=", awd1[1], ", awd1[2]=", awd1[2], 
   ", awd1[3]=", awd1[3], ", awd1[4]=", awd1[4], ", awd1[5]=", awd1[5]);
  }

O que foi mudado:

1. Eu movi a linha contendo int awd1[]; declaração de array dentro da função OnStart()

2. Adicionada a função ArrayResize(awd1,6,7);

3. O roteiro funciona.

Vou tentar tirar algumas conclusões. Em scripts, é correto declarar matrizes dentro da função OnStart(). Após a declaração do array, ele deve ser necessariamente definido em seu tamanho usando a função ArrayResize(); caso contrário, o compilador jurará. Minhas conclusões estão corretas? Caso contrário, favor dar a interpretação correta.

 
silachara:

DiPach , obrigado novamente por sua ajuda. Analisei seus exemplos. Fiz algumas mudanças no meu código de inicialização. O resultado é este:

O que foi mudado:

1. Eu movi a linha contendo int awd1[]; declaração de array dentro da função OnStart()

2. Adicionada a função ArrayResize(awd1,6,7);

3. O roteiro funciona.

Vou tentar tirar conclusões. Em scripts, é correto declarar matrizes dentro da função OnStart(). Depois que a matriz for declarada, ela deve ser necessariamente definida em tamanho usando a função ArrayResize(); caso contrário, o compilador gerará um erro. Minhas conclusões estão corretas? Caso contrário, por favor, me dê uma interpretação correta.

De modo geral, sim. E vai funcionar, pelo menos silenciosamente, mas muito bem. :)

Especificarei apenas os seguintes pontos:

1. Ao declarar variáveis e arrays normais, acho que você deve considerar o que este roteiro (ou EA/indicador) vai fazer e para que estas variáveis/arrays são destinadas.

Seu fluxo de trabalho de script anexo permite a declaração de variáveis não em um nível de programa global, mas localmente. Ou seja, a matriz é declarada uma vez. E não há necessidade de declarações repetidas (looped) no corpo Start(), por exemplo, antes de iniciarmos o loop for() e, por exemplo, quando precisamos de mais alguma declaração variável após for() {}:


Assim, a matriz é declarada não no nível das variáveis globais do programa, mas no corpo do OnStart() antes da declaração do for() loop - é bastante aceitável neste esquema de execução do programa.

Do meu ponto de vista, se não houver necessidade de declarar algo no nível das variáveis globais em um programa, é melhor aproveitar esta oportunidade e declarar tudo o que pudermos localmente.

2. Quanto ao código, deixe-me esclarecê-lo:

void OnStart()
  {
   int awd1[];
   ArrayResize(awd1,6,7);
   for(int i=0;i<6;i++)
     {
      awd1[i]=i+10;
      Print("awd1[",i,"]=",awd1[i]);
     }
   string text=StringConcatenate("awd1[0]=",awd1[0],", awd1[1]=",awd1[1],", awd1[2]=",awd1[2],
                                 ", awd1[3]=",awd1[3],", awd1[4]=",awd1[4],", awd1[5]=",awd1[5]);
   Alert(text);
  }

Ou seja:

  • Você não deve usar o sinal <= (menos que igual) para. Quero dizer, onde estava (i=0;i<=5;i++). Basta colocar sinal <(menor que) e dígito 6 ao invés de 5:
for(int i=0;i<6;i++)

É assim que 5 seria apropriado:

for(int i=5;i>=0;i--)
  • Lembro-me de ter encontrado informações anteriormente de que a função Stringconcatenate contribui para o processamento mais rápido de textos longos. É por isso que costumo usá-lo em meu código. Também o acrescentei aqui, por via das dúvidas.


P./S.: Mais um esclarecimento, por precaução, usando ArrayResize() - para arrays dinâmicos. Na documentação desta função , há informações quando esta função não pode redimensionar arrays dinâmicos.

 
Best_ATS:
Por que não posso adicionar amigos?
E como você imagina um amigo sem conhecê-lo pessoalmente na vida, a partir do trabalho?
 

Olá! Como posso fazer com que o novo preço seja mostrado primeiro e o preço anterior caia para o fundo e assim por diante? Dei um exemplo para que ficasse claro.

double NN=0;
double NN1=0;
double NN2=0;
double NN3=0;
void OnTick()
  {
//---
if(Ask>NN)NN=Ask;
if(NN>NN1)NN1=NN;
if(NN1>NN2)NN2=NN1;
if(NN2>NN3)NN3=NN2;
        Comment(""       
             + "1.   "+"Buy: "" Max: " + DoubleToStr(NN,5)
             + "\n"  
             + "2.   "+"Buy: "" Max: " + DoubleToStr(NN1,5)
             + "\n"  
             + "3.   "+"Buy: "" Max: " + DoubleToStr(NN2,5)
             + "\n"  
             + "4.   "+"Buy: "" Max: " + DoubleToStr(NN3,5)
             + "\n"
             + "------------------------------------------------" );
           
  }
 
abeiks:

Olá! Como posso fazer com que o novo preço seja mostrado primeiro e o preço anterior caia para o fundo e assim por diante? Isso seria um exemplo claro.

Eu fiz um exemplo, e com as condições mais ou menos você mesmo pode descobrir:

double bda_Price[4];
void OnTick()
{
      int li_int;
//---
    if (Ask > bda_Price[0])
    {
        ArrayInitialize (bda_Price, 0.);
        bda_Price[0] = Ask;
        double lda_Price[3];
        ArrayCopy (lda_Price, bda_Price, 0, 1);
        for (int li_int = 1; li_int < 4; li_int++)
        {bda_Price[li_int] = lda_Price[li_int-1];}
    }
    string ls_txt;
    StringInit (ls_txt, 100);
    for (li_int = 0; li_int < 4; li_int++)
    {ls_txt = StringConcatenate (ls_txt, (string) li_int, ".   Buy:  Max: ", DoubleToStr (bda_Price[li_int], Digits), "\n");
    ls_txt = StringConcatenate (ls_txt, "------------------------------------------------" );
    Comment (ls_txt);
//---
}
 
TarasBY:

Eu fiz um exemplo, e você pode trabalhar os termos mais ou menos por conta própria:


Obrigado!
 
abeiks:

Olá! Como posso fazer com que o novo preço seja mostrado primeiro e o preço anterior caia para o fundo e assim por diante? Para deixar claro, eu dei um exemplo.

Aqui está um código completamente primitivo.

double Price1, Price2, Price3, Price4;

void OnTick()
  {
Price4=Price3;
Price3=Price2;
Price2=Price1;
Price1=Ask;
Comment(Price1, "\n", Price2, "\n", Price3, "\n", Price4);
  }
 
silachara:

Aqui está um código perfeitamente primitivo feito.




Obrigado!
 

Olá a todos. Tentou abrir uma ordem comercial no testador de estratégia usando um roteiro rudimentar, falhou.

int start()

{

//----

int res;

double ask=Close[0]+MarketInfo(_Symbol,MODE_SPREAD)*Ponto;

res=OrderSend(Symbol(),OP_BUY,0.1,ask,3,0,0,0,",0,0,0,Blue);

if(res>-1)Alerta("Abrir pedido de compra com bilhete ",res);

//----

retorno(0);

}

Coloquei o roteiro no gráfico de teste no modo de visualização, mas a ordem comercial abre no terminal MT4.

Também não posso obter informações sobre pedidos abertos no testador de estratégias usando o SimpleFXTester_v2.ex4.

Por favor, ajude-me a entender isto.

 
kosmos0975:

Olá a todos. Tentou abrir uma ordem comercial no testador de estratégia usando um roteiro rudimentar, falhou.

int start()

{

//----

int res;

double ask=Close[0]+MarketInfo(_Symbol,MODE_SPREAD)*Ponto;

res=OrderSend(Symbol(),OP_BUY,0.1,ask,3,0,0,0,",0,0,0,Blue);

if(res>-1)Alerta("Abrir pedido de compra com bilhete ",res);

//----

retorno(0);

}

Coloquei o roteiro no gráfico de teste no modo de visualização, mas a ordem comercial abre no terminal MT4.

Também não posso obter informações sobre pedidos abertos no testador de estratégias usando o SimpleFXTester_v2.ex4.

Por favor, ajude-me a entender isto.

Os roteiros do Testador de Estratégia não funcionam.