Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 122

 

Decidiu acrescentar à pergunta anterior.

1)

Suponha que eu tenha um sinal - quando a propagação se amplia acentuadamente (nas notícias)

Fechar todas as negociações atuais

Mas as ordens não fecharão ou abrirão apenas durante as notícias.

Portanto, se tomarmos um comando, digamos, OrderClose, colocá-lo em um loop + Sleep (3000) e executá-lo até que ele feche

2)

Se amarrarmos uma variável interna no botão e atribuirmos o valor pressionado/fechado à possibilidade de abertura do pedido, ela funcionará em tempo real?

 
trader781:

Decidiu acrescentar à pergunta anterior.

1)

Suponha que eu tenha um sinal - quando a propagação se amplia acentuadamente (nas notícias)

Fechar todas as negociações atuais

Mas as ordens não fecharão ou abrirão apenas durante as notícias.

Portanto, se tomarmos um comando, digamos, OrderClose, colocá-lo em um loop + Sleep (3000) e executá-lo até que ele feche

2)

Se amarrarmos uma variável interna no botão e atribuirmos o valor pressionado/fechado à possibilidade de abertura do pedido, ela funcionará em tempo real?

1) Não é o sono(3000), mas o tratamento de erros que ajuda.
 

Saudações, estou escrevendo um indicador que desenhao histórico da ordem em um gráfico, código:

//+------------------------------------------------------------------+
//|                                                      history.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

extern int        MagicNumber                = 1110;
extern datetime   HistoryOrdersFromDateTime  = 0;
extern color      SellColor                  = clrRed;
extern color      BuyColor                   = clrBlue;
extern color      ProfitColor                = clrWhite;
extern bool       DeleteHistoryOrders        = false;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+

void start()
{
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
      {
         if(HistoryOrdersFromDateTime<OrderCloseTime())
         {
            if((TimeCurrent()-OrderCloseTime())>60)
               HistoryOrders();
         }
      }
   }
}

void HistoryOrders()
{
   double b=OrderOpenPrice(), d=OrderClosePrice(), lots=OrderLots(), Profit=0;
   datetime a=OrderOpenTime(), c=OrderCloseTime(), close_time;
   string Ticket=(string)OrderTicket(), type="Sell", symbol=OrderSymbol(), comment=OrderComment(), Background;
   color col=SellColor;
   if(OrderType()==0) {col=BuyColor; type="Buy";}

   if(DeleteHistoryOrders==false)
   {
      //Начальная точка
      ObjectCreate("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJ_ARROW,0,a,b);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJPROP_ARROWCODE,1);
      
      //Линия  
      ObjectCreate("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJ_TREND,0,a,b,c,d);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_WIDTH,1);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_STYLE,STYLE_DOT);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_RAY,0);
  
      //Конечная точка
      ObjectCreate("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJ_ARROW,0,c,d);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJPROP_ARROWCODE,3);

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               Ticket=(string)OrderTicket();
            }  
         }      
      }
      
      //Размер фона  
      for(int i=2; i<StringLen(DoubleToString(Profit,2)); i++)
         StringAdd(Background,"g");
      
      //Фон профита
      ObjectCreate("#"+Ticket+" Background",OBJ_TEXT,0,c,d);
      ObjectSet("#"+Ticket+" Background",OBJPROP_ANCHOR,ANCHOR_LOWER);
      ObjectSetText("#"+Ticket+" Background",Background,10,"Webdings",col);
      ObjectSet("#"+Ticket+" Background",OBJPROP_PRICE1,d);
      ObjectSet("#"+Ticket+" Background",OBJPROP_TIME1,c+Period());
  
      //Профит
      ObjectCreate("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJ_TEXT,0,c,d);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_ANCHOR,ANCHOR_LOWER);
      ObjectSetText("#"+Ticket+" Profit: "+DoubleToString(Profit,2),DoubleToString(Profit,2),10,"Arial",ProfitColor);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_PRICE1,d);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_TIME1,c+Period());
   } else ObjectsDeleteAll(0, "#"+Ticket+" ");  
}

void OnDeinit(const int reason)
{  
   //Удалаение истории ордеров
   for(int i=0; i<OrdersHistoryTotal(); i++)
   {
      DeleteHistoryOrders=true;
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         HistoryOrders();
   }
}

O indicador desenha corretamente os negócios individuais (linha>background>profit), mas há um pequeno "bug" na exibição de conjuntos de ordens fechadas (captura de tela anexada), as linhas são sobrepostas no background e lucro (linha(1)>background>profit>line(2)>line(3)>line(4) .. . . .).

Deve ser como segue: (linha(1)>linha(2)>linha(3)>linha(4) . . . >fon>profit). Várias adulterações não tiveram sucesso, por favor, ajude a refinar.

Arquivos anexados:
 
ilnur17021992:

Saudações, estou escrevendo um indicador que mostrao histórico de pedidos em um gráfico,


O indicador faz um único negócio corretamente (linha>background>profit), mas na exibição de um conjunto de ordens fechadas há um pequeno "shoosh" (eu anexei uma captura de tela), as linhas (linha(1)>background>profit>line(2)>line(3)>line(4) ... . ).

Deve ser como segue: (linha(1)>linha(2)>linha(3)>linha(4) . . . >fon>profit). Várias adulterações não tiveram sucesso, por favor, ajude a refinar.

Tente atribuir linhas e ícones para a propriedade OBJPROP_BACK em segundo plano.
ObjectSetInteger - Графические объекты - Справочник MQL4
ObjectSetInteger - Графические объекты - Справочник MQL4
  • docs.mql4.com
ObjectSetInteger - Графические объекты - Справочник MQL4
 
Alexey Viktorov:
Tente atribuir a propriedade OBJPROP_BACK a linhas e ícones em segundo plano.
Não é uma opção, as linhas são desenhadas no fundo (atrás dos castiçais). O desenho deve ser sobre os castiçais: castiçais> linhas> fundo lucrativo> fundo lucrativo
Arquivos anexados:
 
ilnur17021992:
Não é uma opção, então as linhas estão no fundo (atrás dos castiçais), e o desenho deve estar sobre os castiçais: castiçais>linhas>linha>linha de lucro>linha de lucro
Em seguida, apenas a seqüência de desenho na tabela. Ou, ao desenhar o fundo e o lucro, devemos verificar a existência desses objetos por tempo, ler o valor do lucro no objeto OBJ_TEXT e adicioná-lo ao lucro da ordem atual. Então devemos apagar o fundo e lucrar e desenhá-los novamente.
A propósito, isto eliminará um ciclo adicional para o cálculo do lucro.

Você pode fazer isso
      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               Ticket=(string)OrderTicket();
            }  
         }      
      }
você define o lucro no início junto com todos os outros parâmetros do pedido.

ps Por favor. Coloque uma foto com este botão
 
Alexey Viktorov:
Em seguida, apenas a seqüência de desenho na tabela. Ou, ao desenhar o fundo e o lucro, devemos verificar a disponibilidade desses objetos por tempo, ler o valor do lucro no objeto OBJ_TEXT e adicioná-lo ao lucro da ordem atual. Então devemos apagar o fundo e lucrar e desenhá-los novamente.
A propósito, isto eliminará a necessidade de um ciclo adicional para o cálculo do lucro.
Você define o lucro no início junto com todos os outros parâmetros do pedido.

Como eu defino esta seqüência de desenho, digamos, primeiro desenhar todos os pontos e as linhas que os conectam, e depois começar a desenhar o fundo e o lucro?

 
ilnur17021992:

Como eu defino esta seqüência de desenho, digamos, primeiro desenhar todos os pontos e linhas que os conectam, e depois proceder para desenhar o fundo e o lucro?

Bem, se por minha primeira suposição, então assim é. E então tive imediatamente um pensamento improvisado e não apaguei a primeira frase, mas gosto mais da segunda.

É melhor considerar esta variante.

ObjectFind() então se o objeto for encontrado ObjectGetString() traduzi-lo do texto para o número, adicionar o lucro do último pedido ao valor obtido, apagar o obsoleto OBJ_TEXT e desenhar um novo.
Se for a primeira ou única ordem fechada nesta barra, simplesmente desenhamos
OBJ_TEXT e isso é tudo.
Para facilitar, devemos especificar o horário de abertura do bar em vez do ingresso. Ou o bilhete é necessário para o trabalho posterior?

 
Alexey Viktorov:
Bem, se na minha primeira suposição, é verdade. E então tive imediatamente um pensamento improvisado e não apaguei a primeira frase, mas gosto mais da segunda.

É melhor considerar esta variante.

ObjectFind() então se o objeto for encontrado ObjectGetString() convertê-lo de texto para número, adicionar o lucro do último pedido ao valor obtido, apagar o obsoleto OBJ_TEXT e desenhar um novo.
Se for a primeira ou única ordem fechada nesta barra, simplesmente desenhamos
OBJ_TEXT e isso é tudo.
Para facilitar, devemos especificar o horário de abertura do bar em vez do ingresso. Ou o bilhete é necessário para o trabalho posterior?

Sim, o bilhete é necessário para a análise posterior da história. Obrigado pela dica de redesenhar. Resolveu o problema um pouco mais facilmente adicionando esta verificação e redesenhando o código:

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               ProfitTicket=(string)OrderTicket();
               CountOrders++;
            }  
         }      
      }
      
      //Перерисовка фона и профита
      if(CountOrders>1)
      {  
         ObjectDelete("#"+Ticket+" Background");
         ObjectDelete("#"+Ticket+" Profit: "+DoubleToString(Profit,2));
         Ticket=ProfitTicket;      
      }

Não sei se está correto, mas em princípio desenha como deve ser (linhas>fon>profit):

 
ilnur17021992:

Sim, o bilhete é necessário para analisar o histórico mais tarde. Resolveu o problema um pouco mais facilmente adicionando tal verificação e redesenhando o código:

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               ProfitTicket=(string)OrderTicket();
               CountOrders++;
            }  
         }      
      }
      
      //Перерисовка фона и профита
      if(CountOrders>1)
      {  
         ObjectDelete("#"+Ticket+" Background");
         ObjectDelete("#"+Ticket+" Profit: "+DoubleToString(Profit,2));
         Ticket=ProfitTicket;      
      }

Basicamente, ele desenha corretamente (linhas>fundo>lucro):

Bem, tudo bem, estou feliz por você.
Razão: