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

 
neverness:

Eu já descrevi a tarefa mais simples.

MetaEditor aberto.

Clique em File->Create.

No campo pop-up, selecione Indicador.

...

Mas este código não é aceito pelo tradutor MQL.

Responderei em cerca de 20 minutos

 
neverness:

O que vocês, crianças, estão realmente fazendo, agitando as águas?

Ninguém está fazendo alarde. A situação está finalmente começando a se esclarecer um pouco. Acontece que você chama um roteiro de uma função que não pode ser colocada no corpo do código principal.

Também não se esqueça que a MT tem a intenção de trabalhar com dinheiro que deve ser protegido contra os ataques de terceiros. Daí a maior parte das limitações do idioma.

nevrálgico:

Eu já descrevi uma tarefa simples.

MetaEditor aberto.

Clique em File->Create.

No campo pop-up, selecione Indicador.

No campo Indicator OnCalculate(), embutir qualquer objeto de script com o evento OnStart().

Pessoalmente, não sei como fazer isso. Bem, por exemplo, assim:

int OnCalculate(const int taxas_total,
const int prev_calculado,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
for(int i = 1; i < 100;i++)

{

if(open[i] > Max)

{

OnStart()

E aqui escrevemos um roteiro para a construção do objeto em que estamos interessados. Por exemplo, uma elipse ou uma carta em uma carta ou outra coisa

} //if(aberto)

} //for(int i)
//--- valor de retorno de pré_cálculo para a próxima chamada
retorno(taxas_total)
} // OnCalculate

Isso deveria ser algo parecido com isto.

Mas o tradutor da MQL não percebe tal código.

Deve ser algo parecido com isto

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
for(int i = 1; i < 100;i++)
      {
      if(open[i] > Max)
            {
            
           if(int  ObjectFind(chart_id, /* идентификатор графика*/ object_name/* имя объекта*/) < 0)
            ObjectCreate(Здесь параметры функции согласно документации.
                         Например, эллипса, или буквы на графике, или еще чего-нибудь);
               
            }  //if(open)
      }  //for(int i)  
//--- return value of prev_calculated for next call
   return(rates_total);
  } // OnCalculate
 
Vitaly Muzichenko:

Em cerca de 20 minutos eu responderei.

Demorou muito tempo para carregar o vídeo - mais de 40 minutos.


//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
 {
  EllipseCreate(0, "Ellipse", 0, 0, 0, 0, 0, 0, 0, clrRed, STYLE_SOLID, 1, true, true);
//--- indicator buffers mapping
   return(INIT_SUCCEEDED);

 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
 ArraySetAsSeries(time,true);
 ArraySetAsSeries(open,true);
 // ....
  ObjectMove(0, "Ellipse",0,time[1],open[5]);
  ObjectMove(0, "Ellipse",1,time[10],open[15]);
  ObjectMove(0, "Ellipse",2,time[20],open[25]);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

bool EllipseCreate(const long            chart_ID=0,        // ID графика 
                   const string          name="Ellipse",    // имя эллипса 
                   const int             sub_window=0,      // номер подокна  
                   datetime              time1=0,           // время первой точки 
                   double                price1=0,          // цена первой точки 
                   datetime              time2=0,           // время второй точки 
                   double                price2=0,          // цена второй точки 
                   datetime              time3=0,           // время третьей точки 
                   double                price3=0,          // цена третьей точки 
                   const color           clr=clrRed,        // цвет эллипса 
                   const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий эллипса 
                   const int             width=1,           // толщина линий эллипса 
                   const bool            fill=false,        // заливка эллипса цветом 
                   const bool            back=false,        // на заднем плане 
                   const bool            selection=true,    // выделить для перемещений 
                   const bool            hidden=true,       // скрыт в списке объектов 
                   const long            z_order=0)         // приоритет на нажатие мышью 
  { 
//--- установим координаты точек привязки, если они не заданы 
  // ChangeEllipseEmptyPoints(time1,price1,time2,price2,time3,price3); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим эллипс по заданным координатам 
   if(!ObjectCreate(chart_ID,name,OBJ_ELLIPSE,sub_window,time1,price1,time2,price2,time3,price3)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать эллипс! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- установим цвет эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим стиль линий эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); 
//--- установим толщину линий эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); 
//--- включим (true) или отключим (false) режим заливки эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- включим (true) или отключим (false) режим выделения эллипса для перемещений 
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект 
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection 
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- успешное выполнение 
   return(true); 
  } 
Arquivos anexados:
Set.mq5  10 kb
 
Vitaly Muzichenko:

Demorou muito tempo para carregar o vídeo - mais de 40 minutos.

Às vezes também misturo seções do fórum e escrevo uma resposta a uma pergunta em mql4 em mql5.

Em princípio, neste caso nada mudará, exceto a extensão do arquivo, mas em mql4 será supérfluo

 ArraySetAsSeries(time,true);
 ArraySetAsSeries(open,true);

e até mesmo completamente desnecessário e inútil.

 
neverness:

O que vocês, crianças, estão fazendo, realmente, agitando as águas?

Basta entrar no MetaEditor, e digitar o comando: Arquivo->Criar...

Isto trará à tona um formulário com diferentes arquivos fictícios.

Em particular, serão arquivos fictícios:

- Consultor especializado

- Indicador personalizado

- Roteiro

- Biblioteca, etc.

Estamos interessados nos três primeiros itens: Expert Advisor, Custom Indicator e Script.

Vamos comparar estes manequins:

No Expert Advisor, temos eventos:

-OnInit(), OnDeinit(), OnTick(), OnTimer, OnChartEvent() ... tudo, não mais.

No roteiro, temos os eventos:

- OnStart() ... é isso, não mais.

no indicador que temos eventos:

- OnInit(), OnCalculate(), OnTimer, OnChartEvent() ... tudo, não mais.

A questão natural aqui é como fazer a conexão entre esses objetos.

Acontece que não há nem pode haver conexão entre eles na MQL, porque os fluxos de dados entre estes objetos estão completamente separados e não há conexão entre eles.

Além disso, estou surpreso com o fato de que os criadores da MQL nos dão este fato como um "bem".

E se, por exemplo, em C++, posso facilmente chamar o tradutor BASIC ou Javascript ou qualquer outro tradutor e mudar, por exemplo, para o ambiente de programação Android,

no âmbito da MQL, não posso nem mesmo criar um chamado "script" em ambiente "indicador", porque o ambiente indicador não aceita o comando OnStart().

Que tipo de aberração é esta?

E há coisas tão feias na MQL mais do que suficientes.

Eles estão a cada passo.

Eu li a descrição da MQL - e estou surpreso, porque não há mais nada a fazer.

Enquanto os criadores da MQL proclamam em voz alta que a MQL é descendente de C++.

Claro, sinto muito, mas quero perguntar aos criadores do MQL: - Herdeiro de quê? - Em sua fealdade?


Eu comparo involuntariamente o MQL com o famoso ambiente de programação 1C. Eles também afirmam ser os herdeiros do C++.

Mas tudo é feito muito mais decentemente lá.

E os objetos gráficos, e a comunicação entre os módulos e muito mais.

E o que há na MQL?

Sem classes embutidas, sem objetos relacionados a fios... e nada de nada.

E eu ainda não disse nada sobre a casca matemática do terminal!!!

Esse é um tema totalmente à parte para surpresas!!!

Por que você não lê um pouco de Ajuda e encontra todas aquelas coisas que você está dizendo que não existem, lê sobre aulas integradas na SB, aprende a pedir ajuda educadamente (você pediu ajuda) e aprende a não ser rude com as pessoas que estão tentando ajudá-lo (note isto desinteressadamente)...

Em geral - proíba você por 24 horas por trolling, rudeza e mendicidade (você não mostrou uma linha de seu código para provar todas as suas declarações, mas impudicamente exige que as pessoas que responderam à sua pergunta e declarações, eles lhe fornecerão o código de trabalho para suas necessidades - não é comum aqui - eles ajudam, não fazem por você, note - o código mais simples)

Sem ofensa - aquele que vem até nós sem nada será morto por algo ininteligível.

Mais ainda, eu o avisei para diminuir o aquecimento:

 

como instalar o mt4 em macOS? ajude por favor!

 

Exclusivamente em uma máquina virtual. Eu tenho Parallel é caro, mas conveniente e confiável.

https://www.parallels.com/ru/products/desktop/

Запуск Windows на Mac — виртуальная машина Parallels Desktop 14 для Mac
  • www.parallels.com
Можно запустить Windows параллельно с macOS® (перезагрузка не требуется) на компьютерах MacBook®, MacBook Pro®, iMac®, iMac Pro®, Mac mini® или Mac Pro®. Предоставляйте общий доступ к файлам и папкам, копируйте и вставляйте текст и изображения, перетаскивайте файлы между приложениями Mac и Windows. Удобная настройка Parallels Desktop...
 

Estou pedindo ajuda. As questões são:

1. O programa não estabelece limites de perdas tanto na compra quanto na venda em modo de teste. Mas a modificação de ordens pendentes vai bem.

2. Ela não começa em tempo real por conta disso.

Por favor, ajude.

Também gostaria de pedir para apontar quaisquer erros que possam ter ocorrido durante a redação do programa.

Muito obrigado de antemão.

Código do programa:

.input int Porcentagem=50;

entrada no MAGICNUMBER=413;

//Introdução de constantes indicadoras e osciladores para os gráficos de longo prazo

input int Signal_Period_long_term=6;

input int Fast_EMA_Period_long_term=12;

input int Slow_EMA_Period_long_term=24;

//Impacto dos parâmetros dos indicadores e constantes dos osciladores para gráficos de curto prazo

input int Stochastic_Kperiod_short_term=5;

input int Stochastic_Dperiod_short_term=3;

input int Stochastic_slowing_short_term=3;

input ENUM_TIMEFRAMES PERÍODOS_curto_term=PERIOD_M5;

input ENUM_TIMEFRAMES PERÍODOS_long_term=PERIOD_H1;

//-----------------------------------------------------------------------------------------

/como variáveis comuns e seus tipos

data/hora estática Novo_tempo;// hora da barra atual

data/hora estática Hora_Local;

Margem_Percentagem dupla; /Meios de abertura para abertura de pedidos

Lotes duplos;//Determinação do número total de lotes

duplo Lotes_Volume;

//Variáveis e tipos para o gráfico de longo prazo

MacdCurrent_long_term duplo;//MACD parâmetros da linha principal da barra atual

double MacdPrevious_long_term;//MACD parameters of the main line of the previous bar

duplo SinalCurrent_long_term;

//Variáveis e tipos para o gráfico de curto prazo

dupla Stochastic_Current_short_term_main;//Stochastic parameters of the current bar on the 5-minute chart

duplo Stochastic_Previous_short_term_main;//Stochastic parameters of the previous bar on the 5-minute chart

duplo Stochastic_Current_short_term_signal;//Stochastic parameters of the current bar in the 5-minute chart

duplo Stochastic_Previous_short_term_signal;//Stochastic parameters of the previous bar on the 5-minute chart

stopLoss_BUY duplo;

stopLoss duplo_SELL;

preço duplo_BUY;

preço duplo_SELL;

//+------------------------------------------------------------------+

//| Função de inicialização do especialista |

//+------------------------------------------------------------------+

int OnInit()

{

//---


//---

return(INIT_SUCCEED);

}

//+------------------------------------------------------------------+

//| Função de desinicialização especializada |

//+------------------------------------------------------------------+

nulo OnDeinit(const int razão)

{

//---


}

//+------------------------------------------------------------------+

//| função tick expert |

//+------------------------------------------------------------------+

nulo OnTick()

{

int ticket,cnt;

int total=OrdensTotal();// Determinação do número de pedidos

bool New_Bar=false; // Bandeira nova barra


//Definir os valores variáveis para o gráfico de longo prazo

MacdCurrent_long_term=iMACD(NULL,PERÍODOS_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,1);

MacdPrevious_long_term=iMACD(NULL,PERÍODOS_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,2);

SignalCurrent_long_term=iMACD(NULL,PERÍODOS_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_SIGNAL,1);

//Determinação de valores variáveis para o gráfico de curto prazo

Stochastic_Current_short_term_main=iStochastic(NULL,PERÍODOS_curto_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,1);

Stochastic_Previous_short_term_main=iStochastic(NULL,PERÍODOS_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,2);

Stochastic_Current_short_term_signal=iStochastic(NULL,PERÍODOS_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,1);

Stochastic_Previous_short_term_signal=iStochastic(NULL,PERÍODOS_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,2);

//Definição de variáveis comuns

Price_BUY=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);

Price_SELL=iLow(NULL,PERÍODOS_curto_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);

StopLoss_BUY=iLow(NULL,PERÍODOS_curto_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);

StopLoss_SELL=iHigh(NULL,PERÍODOS_curto_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);

Margin_Percent=AccountFreeMargin()*Percent/100;

Lots=NormalizeDouble(Margin_Percent/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);

Lots_Volume=NormalizeDouble(MathFloor(Lots)+MarketInfo(Symbol(),MODE_LOTSTEP),2);

//-----------------------------------------------------------------------------------------------------------------------

//----- Определение нового бара------------------------------------------------------------------------------------------

Novo_Time=TimeCurrent();

Imprimir("Time=",TimeCurrent();

Print("Bar open time =",iTime(NULL,PERÍODOS_curto_term,0));

if(iTime(NULL,PERÍODOS_curto_term,0)==Novo_Tempo) // Comparar tempos

{

if(iVolume(NULL,PERÍODOS_curto_terminal,0)<=2) //compare volume

Imprimir("Bar volume =",Volume[0]);

if(iBarShift(NULL,PERÍODOS_curto_terminal,TimeCurrent())==0)//Cheque o índice de barras

Print("Bar index =",iBarShift(NULL,PERÍODOS_curto_terminal,TimeCurrent());

New_Bar=true; // Uma nova barra é apanhada

Imprimir("New_Bar");

}

senão se(New_Bar==false) // Se a barra não for nova...

{

Imprimir("Barra não é nova");

retornar;

}

//---Cheque a disponibilidade de fundos para abrir o lote mínimo

if(Margin_Percent<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT))

{

Imprimir("Não há fundos suficientes. Fundos livres = ",AccountFreeMargin()));

retornar;

}

//---Determinação do número de lotes

if(Lotes>Lots_Volume)

{

Lots=NormalizeDouble(Lots_Volume,2);

Imprimir("Número de lotes : ",Lotes);

}

senão se (Lotes<Lots_Volume)

{

Lots=NormalizeDouble(MathFloor(Lots),2);

Imprimir("Número de lotes : ",Lotes);

}

//+------------------------------------------------------------------+

//| Condições para abertura de pedidos se o número de pedidos for igual a zero |

//+------------------------------------------------------------------+

if(total<1)

{


if(MacdCurrent_long_term<0 && MacdCurrent_long_term>SignalCurrent_long_term)

Imprimir ("A condição é verdadeira para COMPRAR");

{

//+---------------------------------------------------------------------------+

//| Condição para abrir uma posição longa de COMPRA apenas |

//+---------------------------------------------------------------------------+

if(Stochastic_Current_short_term_main<Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main>=Stochastic_Previous_short_term_signal)

{

ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price_BUY,3,0,0,NULL,MAGICNUMBER,0,Blue);

if(ticket>0)//check position opened

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

{

Imprimir("COMPRAR pedido aberto : ",OrderOpenPrice());

retornar;

}

else Print("BUY order open error : ",GetLastError()));

retornar;

}

}

}

if(MacdCurrent_long_term>0 && MacdCurrent_long_term<SignalCurrent_long_term)

Imprimir ("A condição é verdadeira para VENDER");

{

//+---------------------------------------------------------------------------+

//| Condição para abertura de posições curtas de VENDA somente |

//+---------------------------------------------------------------------------+

if(Stochastic_Current_short_term_main>Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main<=Stochastic_Previous_short_term_signal)

{

ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Price_SELLL,3,0,0,NULL,MAGICNUMBER,0,Green);

if(ticket>0)//check position opened

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

{

Imprimir("VENDER pedido aberto : ",OrderOpenPrice());

retornar;

}

else Print("Error opening SELL order : ",GetLastError()));

retornar;

}

}

}

}


//+---------------------------------------------------------------------------+

//| Condições de modificação de pedidos |

//+---------------------------------------------------------------------------+


for(cnt=0;cnt<total;cnt++)

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

{

if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))

continuar;

if(OrderMagicNumber()==MAGICNUMBER && // verifique o número mágico do pedido

OrderSymbol()==Symbol()) // verificar o símbolo do pedido

{

//--- posição longa aberta

if(OrderType()==OP_BUYSTOP)

{

if(OrderOpenPrice()<Price_BUY && Ask<Price_BUY)

{

if(OrderModify(OrderTicket(),Price_BUY,0,0,0,0,Blue))

Print("O pedido Price_BUY foi modificado com sucesso");

senão Imprimir("Erro ao modificar o pedido de BUYStop. Código de erro=",GetLastError()));

retornar;

}

senão Imprimir ("Preço de modificação é mais alto que o preço do pedido");

retornar;

}

if(OrderType()==OP_SELLSTOP)

{

if(OrderOpenPrice()<Price_SELLL && Bid>Price_SELLL)

{

if(OrderModify(OrderTicket(),Price_SELL,0,0,0,0,Green))

Print("O pedido Price_SELL foi modificado com sucesso");

else Print("Erro ao modificar o pedido SELLStop. Código de erro=",GetLastError();

retornar;

}

}

if(OrderType()==OP_BUY)

{

if(OrderStopLoss()<StopLoss_BUY && StopLoss_BUY<Ask)

{

if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_BUY,0,0,Blue))

Print("Price_BUY preço do pedido modificado com sucesso");

senão Imprimir("Erro modificando a ordem de compra. Código de erro=",GetLastError()));

retornar;

}

}

if(OrderType()==OP_SELL)

{

if(OrderStopLoss()>StopLoss_SELLL && StopLoss_SELLL>Bid)

{

if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELLL,0,0,Green))

Print("Preço_SELL preço do pedido modificado com sucesso");

senão Imprimir("Erro ao modificar o pedido de VENDA. Código de erro=",GetLastError();

retornar;

}

}

}

}


}

//+------------------------------------------------------------------+

 

Ajuda a consertar um bug no indicador, ele não se eleva nem abaixa do dia quando está na última vela da hora.

https://prnt.sc/kut6xo

https://prnt.sc/kut79b

Скриншот
Скриншот
  • prnt.sc
Снято с помощью Lightshot
Arquivos anexados:
 
Michail_David:

Estou pedindo ajuda. As questões são:

1. O programa não estabelece limites de perdas tanto na compra quanto na venda em modo de teste. Mas a modificação de ordens pendentes vai bem.

2. Ela não começa em tempo real por conta disso.


É assim que

 if(OrderType()==OP_SELL)

           {

            if(OrderStopLoss()!= StopLoss_SELL && StopLoss_SELL>Bid)

modificará E codificará, inserindo-o corretamente (Alt+S).

Razão: