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 801

 

Eu não entendo qual é o problema?

int start() 

{

bool i;

int ticket;

double Pricem;

datetime Timen; 

string Symb=Symbol();

ticket=OrderSend(Symb,OP_SELL,0.1,Bid,3,Ask+4*Point,Ask-12*Point);

i=OrderSelect(0,SELECT_BY_POS);

while(true)

{

RefreshRates();

Timen=OrderCloseTime();

  if(Timen>0)

   {

     Pricem=OrderClosePrice();

     Alert(Pricem);

     Alert("ордер закрылся");

     Sleep(30000);

 }

 Sleep(10);

 }

return;                              

}


Uma mensagem de fechamento deve aparecer. A ordem abre, chega à parada, fecha e pronto! Onde está o erro?
 

Estou resolvendo a tarefa de fechar todos os gráficos abertos usando as ferramentas MQL4. Existem 3 gráficos abertos com diferentes pares de moedas e este é o código do roteiro:

   for (int i=1;i<=3;i++) {
      long current=ChartID();
      Print("итерация цикла: ",i,", идентификатор текущего графика ",current);
      bool result=ChartClose(current);
      if(result)Print("окно успешно закрыто");
      else Print("не удалось закрыть окно с идентификатором: ", current);
   }

Quando eu executo o roteiro, apenas um dos três gráficos é fechado e aqui estão as impressões do log:

AUDUSD,H1: итерация цикла: 1, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто
AUDUSD,H1: итерация цикла: 2, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто
AUDUSD,H1: итерация цикла: 3, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто

Isso significa que, após o fechamento de um gráfico, o gráfico atual deve ser o outro, mas:

1. Após o primeiro gráfico ser fechado, a funçãoChartIDretorna o identificador do gráfico fechado em vez do atual

2. Afunção ChartClose() em 2 e 3 iterações retorna verdadeiro, o que significa que fecha com sucesso a janela já fechada...

Quem sabe onde está o bug e como resolver este problema?

 
CJIeCaPb:

Eu não entendo qual é o problema?

Uma mensagem de fechamento deve aparecer. A ordem abre, chega à parada, fecha e pronto! Onde está o erro?

Eu acho que OrderSelect() deve estar dentro do loop while, e além disso, o número da posição estará incorreto, porque depois de fechar se tornará diferente - neste caso é melhor selecionar por ticket
 
tuner:
Acho que OrderSelect() deve estar dentro de um laço de tempo, e além disso, o número de posição estará incorreto, porque depois de fechado se tornará diferente - neste caso é melhor selecionar a partir do bilhete
Hurra, funcionou! Obrigado!
 
tuner:

Estou resolvendo a tarefa de fechar todos os gráficos abertos usando as ferramentas MQL4. Existem 3 gráficos abertos com diferentes pares de moedas e este é o código do roteiro:

Quando eu executo o roteiro, apenas um dos três gráficos é fechado e aqui estão as impressões do log:

Isso significa que, após o fechamento de um gráfico, o gráfico atual deve ser o outro, mas:

1. Após o primeiro gráfico ser fechado, a funçãoChartIDretorna o identificador do gráfico fechado em vez do atual

2. Afunção ChartClose() em 2 e 3 iterações retorna verdadeiro, o que significa que fecha com sucesso a janela já fechada...

Quem sabe onde está o bug e como resolver este problema?

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(currChart<0) break;  
      prevChart=currChart;
      ChartClose(currChart);
      i++;
     }
     ChartClose(ChartFirst());
  }
//+------------------------------------------------------------------+
 

pako, às vezes funciona, às vezes não funciona, não sei porquê... Eu recebo um erro:

2014.12.11 17:52:12.456 Violação de acesso lido para 0x09295000 em 'C:\.....................ex4'.

Poderia ser porque está tentando fechar o gráfico em que o roteiro é jogado?

O PS funciona corretamente se o roteiro estiver anexado ao primeiro gráfico da esquerda. Mas se eu colocá-lo em qualquer outra tabela, recebo um erro

 
tuner:

pako, às vezes funciona, às vezes não funciona, não sei porquê... Eu recebo um erro:

2014.12.11 17:52:12.456 Violação de acesso lido para 0x09295000 em 'C:\.....................ex4'.

Poderia ser porque está tentando fechar o gráfico em que o roteiro é jogado?

O PS funciona corretamente se o roteiro estiver anexado ao primeiro gráfico da esquerda. Mas se eu colocá-lo em qualquer outra tabela, recebo um erro

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(currChart<0) break; 
      ChartClose(currChart); 
      prevChart=currChart;
      i++;
     }
     ChartClose(ChartFirst());
  }
//+------------------------------------------------------------------+
 

Rapazes, ajudem-me aqui

O problema é a seguinte função para traduzir a ordem em não-perda, ela começa a funcionar incorretamente se eu a colocar nos pares de ienes e permitir todas as ordens abertas em não-perda

deixo todos eles ok, mas em cinco dígitos ele volta a zero mesmo que eu o ajuste para cinco dígitos apenas, mas o melhor é que se eu o ajuste para cinco ele funciona ok

Qual a razão de tal trabalho? O que deve ser levado em conta nessas funções, para que a execução correta seja realizada e não dependa da operação da EA em que janela eu atirei três ou cinco dígitos?

Muito obrigado.

    }

 //==================================================================================================

 // функция перевода ордеров стоп лоса в без убыток по всем открытым ордерам

 //==================================================================================================

 if(_Simbol==false)//если false то по всем ордерам открытым 

 { 

   for(int i=0;i<OrdersTotal();i++)//цикл перебора ордеров

     {

       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))//будем искать следующие

         {

           if(OrderType()==OP_BUY) //если тип бай

            {

             double  bid=MarketInfo(OrderSymbol(),MODE_BID);//последний известный бид инструмента

             double  point=MarketInfo(OrderSymbol(),MODE_POINT);//чему равен пункт инструмента

             

               if(OrderStopLoss()<OrderOpenPrice())//если стоп лос меньше цены открытия

                {

                  if(bid-Dist_Perivoda*point>OrderOpenPrice())//бид-профит*пункт больше цены открытия

                   {//модифицируем стоп лос

 bool ord_modifik=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+NormalizeDouble(Level_Zahiti*point,Digits),OrderTakeProfit(),0,clrNONE);

              if(!ord_modifik)//если не получилось

              Comment(GetLastError());//номер ошибки в угол

                   }

                   

                }

            }

            if(OrderType()==OP_SELL)//если тип селл

            {

              double ask=MarketInfo(OrderSymbol(),MODE_ASK);//последний известный аск инструмента

              double  point=MarketInfo(OrderSymbol(),MODE_POINT);//чему равен пункт инструмента

              

              if(OrderStopLoss()==0||OrderStopLoss()>OrderOpenPrice())//если стоп лос больше цены открытия или равен нолю

              {

                if(ask+Dist_Perivoda*point<OrderOpenPrice())//аск +профит*пункт меньше цены открытия

                  {//модифицируем стоп лос

  bool ord_modifik=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-NormalizeDouble(Level_Zahiti*point,Digits),OrderTakeProfit(),0,clrNONE);

                  if(!ord_modifik)//если не получилось

                  Comment(GetLastError());//номер ошибки в  угол

                  }

                }

             } 

          }

       }

    }

  

 
pako:

Obrigado pelo código, entendo a essência, embora às vezes eu ainda receba um erro.

Experimentado com funções que mostram as IDs dos gráficos. O que é ChartFirst() da documentação não é absolutamente claro, pode-se interpretar de qualquer forma - pode ser a primeira carta aberta por ordem da esquerda, ou a primeira carta aberta de todas as cartas abertas (no tempo), ou a primeira aberta no terminal (a possibilidade de estar aberta agora é quase zero, portanto não faz sentido fechá-la). Estou mais inclinado a esta última versão, porque nunca vi esta função devolver o ID do gráfico, que está aberto no momento.

 
tuner:

Obrigado pelo código, entendo a essência, embora às vezes eu ainda receba um erro.

Experimentado com funções que mostram as IDs dos gráficos. O que é ChartFirst() da documentação não é absolutamente claro, pode-se interpretar de qualquer forma - pode ser a primeira carta aberta por ordem da esquerda, ou a primeira carta aberta de todas as cartas abertas (no tempo), ou a primeira aberta no terminal (a possibilidade de estar aberta agora é quase zero, portanto não faz sentido fechá-la). Estou mais inclinado a esta última versão, porque nunca vi esta função devolver o ID do gráfico que está aberto no momento.

ChartFirst

Retorna o ID do primeiro gráfico do terminal do cliente.

Eu entendo que este é o gráfico mais à esquerda.

Razão: