[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 207

 
solnce600:

Senhores, por favor, digam-me como codificar (provavelmente em uma declaração condicional) uma idéia simples

-se um comércio fosse fechado com um stop loss

-abrir outro comércio ao preço de stop loss

Obrigado

Dê uma olhada ao redor.
 
Roger:

1. Não é possível abrir ordens na função init() (No Testador de Estratégia, isto ainda funcionará, mas não funcionará na demonstração).

2. Ao fechar os pedidos, você deve contar do final ao início, e não o contrário, como no seu caso.

Obrigado por sua resposta.
Neste caso, o operador do laço foi investigado no testador, por isso as ordens são abertas no init() para simplificação, isto não acontece em EAs reais.
Alterar a ordem de seleção dos pedidos faz com que eles sejam fechados dentro de um tique (dou o código do programa e relatório do registro do testador abaixo).
Parece estranho que a MQL4 não me permita alterar a ordem de trabalho com os pedidos. Se você sabe por que, por favor, avise, pois de acordo com a lógica de trabalho de uma EA vou fechar os pedidos exatamente na ordem em que são abertos.

Sinceramente. Shurkin.

Код программы.

//+------------------------------------------------------------------+
//|                                                     Poligon1.mq4 |
//|                                            21 февраля 2013 года. |
//|Тестирование оператора цикла for.                                 |
//+------------------------------------------------------------------+
#property copyright "21 февраля 2013 года."
#property link      ""
//+------------------------------------------------------------------+
//|Объявленные переменные                                            |
//+------------------------------------------------------------------+
int Mn=357;//Magic number
int i;//Показатель счётчика итераций
double PriTP;//TP серии
int Tick;//Счётчик тиков
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----Установка серии ордеров
OrderSend(Symbol(),OP_BUY,0.5,Ask,0,NormalizeDouble(Bid-35*Point,Digits),
NormalizeDouble(Ask+35*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1,Ask,0,NormalizeDouble(Bid-25*Point,Digits),
NormalizeDouble(Ask+25*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUYLIMIT,1,NormalizeDouble(Ask-15*Point,Digits),0,
NormalizeDouble(Bid-40*Point,Digits),NormalizeDouble(Ask+25*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_BUYLIMIT
OrderSend(Symbol(),OP_SELLSTOP,3,NormalizeDouble(Ask-30*Point,Digits),0,
NormalizeDouble(Bid+15*Point,Digits),NormalizeDouble(Ask-75*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_SELLSTOP
//----
   PriTP=Bid;//PriTP
   Print("Кс0:"," OrdersTotal=",OrdersTotal());//Сообщение
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   Tick++;//Tick
//   Print("Кс1:"," Tick=",Tick);//Сообщение
//----
//   for(i=0;i<OrdersTotal();i++)//Инициализация цикла
   for(i=OrdersTotal()-1; i>=0; i--)//
   {
   Print("Кс2:"," Tick=",Tick," i=",i);//Сообщение
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
//----
   return(0);
  }
//+------------------------------------------------------------------+
Записи в журнале тестера.

2013.03.08 13:28:19     Poligon1 EURUSD,M15: removed
2013.03.08 10:14:14     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=3 i=0
2013.03.08 10:14:14     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=3 i=1
2013.03.08 10:13:50     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=2 i=0
2013.03.08 10:13:50     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=2 i=1
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=0
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=1
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=2
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=3
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=4
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=5
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=6
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс0: OrdersTotal=7
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.3367 sl: 1.3410 tp: 1.3322 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.3382 sl: 1.3355 tp: 1.3422 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 ok
2013.03.08 10:13:26     Poligon1 test started
2013.03.08 10:13:24     Poligon1 EURUSD,M15: loaded successfully

 
Muito obrigado pelas valiosas informações, definitivamente tentarei levar em conta tudo o que você me disse no futuro.
 
borilunad:

Você não pode abrir exatamente ao preço de stop loss, mas você pode condicionar a abertura na mesma direção ou em direção oposta!

Aqui está uma chamada de função das "Funções Úteis" de Kim, que você pode colocar em condição:

isCloseLastPosByStop - Retorna a bandeira para fechar a última posição por stop

if(isCloseLastPosByStop() == 0) ou ... == 1) e o que você quiser ......

Você pode encontrar a função aqui: https://www.mql5.com/ru/forum/131859

E coloque isso fora do início!

E eu lhe imploro! Você pode fazer tudo isso sozinho, com diligência, precisão e paciência, caso contrário não aprenderá nada com dicas!

O conhecimento só é adquirido com o esforço adequado de sua parte! Entre no trabalho diário inquisitivo! Boa sorte!


Muito obrigado pelas valiosas informações, definitivamente tentarei levar em conta tudo o que você me disse no futuro.
 

Bom dia.

Por favor, me diga se há situações em que TCs podem alterar ou excluir comentários a um pedido?

Muito obrigado.

 
Gek34:

Por favor me diga se há situações em que TCs podem alterar ou apagar comentários a um pedido...?

A título de exemplo.
Comentário nativo
e121220_3in1 01

Com CD adicionado após o capotamento

e121220_3em1 01[swap]

Isto é, se procurarmos uma ordem com um comentário, devemos determinar preliminarmente o comprimento da linha de comentário nativa e durante a busca só verificamos a primeira parte do comentário alterado no comprimento correspondente. Ou verifique se a cadeia nativa está no comentário que está sendo verificado.

 

Shurkin:

Obrigado pela resposta.
Neste caso, o trabalho do operador de loop foi investigado exatamente no testador, por isso as ordens são abertas no init() para simplificação, isto não acontece em EAs reais.
Alterar a ordem das ordens realmente leva ao seu fechamento dentro de um tick (o código do programa e o relatório do registro de teste são fornecidos abaixo).
Parece estranho que a MQL4 não me permita selecionar um pedido. Se você sabe por quê, por favor, avise, pois a lógica de trabalho do Expert Advisor sugere que os pedidos devem ser fechados exatamente na ordem em que são abertos.

Sinceramente. Shurkin.



A lógica é correta - os números dos pedidos devem ser os mesmos que os números dos pedidos. Uma vez fechado um pedido, todos os outros serão recalculados. Experimente esta construção

 for(i=0, int k=0; i<OrdersTotal();i++,k++)//
   {
   Print("Кс2:"," Tick=",Tick," i=",i);//Сообщение
   if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
   k--;
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
 
Gek34:

Bom dia.

Por favor, me diga se há situações em que TCs podem alterar ou excluir comentários a um pedido?

Muito obrigado.


Experimentamos uma completa mudança de comentário sobre um pedido. Além disso, a magia às vezes é zerada quando o fechamento parcial (o fechamento parcial é iniciado pelo servidor). Agora, existe um conselheiro separado, com loop para controlar este último, que monitora as ordens "alienígenas" e outras inconsistências, notificando através de mensagens Push de forma oportuna.
 

Por favor, diga-me como escrever a condição corretamente:

1.se símbolo de pedido = símbolo e magik de pedido = 135

2.se não houver ordens pendentes BAYSTOP

3.se não houver pedidos em aberto BAY OU (se houver) stoploss>open price

4.se o preço estiver entre MA e fractal up

COLOCAR ORDEM DE COMPRA PENDENTE

ESCRITO DESTA FORMA:

 static bool flag ;

   if(NewBar()==true)

     flag = true; 

     for(int i=0;i<total-1;i++) 

         {

         OrderSelect(i,SELECT_BY_POS); 

          if(OrderSymbol()==Symbol() && OrderMagicNumber()==135) 

          { 

          if(OrderType()<=OP_BUYSTOP) 

           {

           if((OrderType()<=OP_BUY) || (OrderType()==OP_BUY && OrderStopLoss()>OrderOpenPrice()))  

            { 

            if(Ask<m && Ask>ma && frUP>0 && flag)

            {

              double price = NormalizeDouble(frUP+30*Point+(Ask-Bid)*Point,Digits);

             double stoploss = NormalizeDouble(price-sl*Point-30*Point,Digits);

             double takeprofit = NormalizeDouble(price+tp*Point,Digits);

             int ticket = OrderSend(Symbol(),OP_BUYSTOP,Lots,price,5,stoploss,takeprofit,"R",135,TimeCurrent()+55000,Blue);

             if(ticket>0)

               {

               Alert("R!Отложенный ордер BUYSTOP!!! ",Symbol());

               flag = false;

               }

               else

               {

               Print("Lots= ", Lots,"price= ", price,"stoploss= ", stoploss,"takeprofit= ", takeprofit,"Ошибка № ",GetLastError());      

               return;

               }

             }

           }

         }

       }

     } 

NÃO FUNCIONA! ME DIGA QUAL É O ERRO!

 

Por favor, informe o que poderia estar causando o seguinte problema.

Há um indicador que utiliza funções externas. O código compilado da biblioteca está localizado na pasta bibliotecas, descritores - in include.

Conexão #incluir <lib_Zemckikh.mqh>. Durante a primeira execução do indicador, todas as funções da biblioteca funcionam normalmente, o indicador é exibido no gráfico. Após uma mudança de parâmetros (após um novo cálculo do indicador) as funções da biblioteca não são chamadas, o indicador não é exibido, não há entradas na guia "Especialistas" após a mudança de parâmetros.

Se você excluir a conexão da biblioteca e colocar as funções necessárias no arquivo indicador (compilado diretamente com as funções), tudo funciona bem.

Eu não consigo entender o que está errado. Eu não quero poluir o fórum, não estou anexando os códigos. Se você precisar, eu o enviarei pessoalmente.