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

 
Vladislav Andruschenko:
Espalhamento, se definido como atual. Data de término do teste se faturado como atual. Poderia haver muitas outras razões.

Espalhamento fixo, Data final 01.01.18

 
Aidar Kaliaskar:

Diferencial fixo, Data final 01.01.18


custo por ponto..... etc


tente neste fim de semana.

 

Estou tentando fazer um indicador na MQL4, que traçaria uma linha no gráfico "US.500+" por preços próximos de "US.30+". Em geral, as linhas de preços de dois símbolos estariam visíveis em um gráfico. Abaixo está o código, mas ele não funciona. Na mensagem de registro "o indicador no buffer personalizado ainda não é suportado". Ensine-me porque não funciona. Opostas.

#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_color1 clrRed
#property indicator_style1 STYLE_DOT
#property indicator_type1  DRAW_LINE
//---
input string   symbolName="US.30+"; // Symbol name
input double   difference=-22387.0; // Difference from other symbol
//--- price buffer for other symbol
double otherSymbol[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,otherSymbol,INDICATOR_DATA);
//---
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int     rates_total,
                const int     prev_calculated,
                const int     begin,
                const double &price[])
  {
//---
   for(int i=prev_calculated;i<rates_total;i++)
      otherSymbol[i+1]=iClose(symbolName,PERIOD_CURRENT,i)+difference;
   ArraySetAsSeries(otherSymbol,true);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
Maxim Khrolenko:

Estou tentando fazer um indicador na MQL4, que traçaria uma linha no gráfico "US.500+" por preços próximos de "US.30+". Em geral, as linhas de preços de dois símbolos estariam visíveis em um gráfico. Abaixo está o código, mas ele não funciona. Na mensagem de registro "o indicador no buffer personalizado ainda não é suportado". Ensine-me porque não funciona. Opostas.

Porque você tem que usar a primeira forma de chamada.
 
Artyom Trishkin:
Porque você tem que usar a primeira forma de chamada.
Mudou-o e... funcionou! Muito obrigado.
 
STARIJ:

Encontrei o motivo - 60 segundos devem ser contados fora de um loop

Obrigado, obrigado pelo esclarecimento.

Se ao invés de 60 segundos, serão 300.

Ostempos de abertura das posições são diferentes, você precisa escrever com 300 segundos de intervalo em relação ao tempo de abertura das posições.

Como devo fazer isso?

 
lil_lil Se for 300 em vez de 60 segundos ... você precisa escrever em intervalos de 300 segundos a partir do momento em que a posição foi aberta. Como fazer isso?

Você já tentou meu programa? Eu realmente não entendo 300... Se você definir 300 em vez de 60, é verdade? Se você me disser como lucrar com isso, eu tentarei entender melhor!

 

Ajuda com a EA, como sempre o problema é provavelmente trivial, mas ainda não resolvi o enigma

Deve abrir comprar seema>smma deema ou não chegar ao seuponto(mesmo para vender). Deve fechar o negócio no fechamento do bar - abrir um novo bar. O próximo abre da mesma forma, mas com uma condição acima dopreço de abertura do anterior, que é opreço_da_ordem_última_venda.

Mas no final, abre onde quer e fecha. (No início do teste ele abre e fecha imediatamente)

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int MA_period=10;
input int take=200, stop=200, Magic=1104;
input double lot=0.05;
input int slippage=30;
input int point=5;
double last_order_price,fast_MA,slow_MA;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   fast_MA=iMA(Symbol(),PERIOD_CURRENT,MA_period,0,MODE_EMA,PRICE_CLOSE,0);
   slow_MA=iMA(Symbol(),PERIOD_CURRENT,MA_period,0,MODE_SMMA,PRICE_CLOSE,0);
 
   if(fast_MA>slow_MA) last_order_price=0;
      else last_order_price=Ask+stop*_Point;

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

   fast_MA=iMA(Symbol(),PERIOD_CURRENT,MA_period,0,MODE_EMA,PRICE_CLOSE,0);
   slow_MA=iMA(Symbol(),PERIOD_CURRENT,MA_period,0,MODE_SMMA,PRICE_CLOSE,0);
   
   if(Bid<=fast_MA+point*_Point && Bid>=fast_MA && fast_MA>slow_MA && SymOrder() && Bid>last_order_price)
   {
      OrderSend(Symbol(),OP_BUY,lot,Ask,slippage,Ask-stop*_Point,Ask+take*_Point,NULL,Magic,0,clrBlue);
      last_order_price=Bid;
   }
   
   if(Bid>=fast_MA-point*_Point && Bid<=fast_MA && fast_MA<slow_MA && SymOrder() && Bid<last_order_price)
   {
      OrderSend(Symbol(),OP_SELL,lot,Bid,slippage,Bid+stop*_Point,Bid-take*_Point,NULL,Magic,0,clrRed);   
      last_order_price=Bid;
   }
      
   if(!SymOrder() && Volume[0]<2 && OrderType()==OP_BUY)
   {
      OrderClose(OrderTicket(),lot,Bid,slippage,clrWhite); 
      
   }
   if(!SymOrder() && Volume[0]<2 && OrderType()==OP_SELL)
   {
      OrderClose(OrderTicket(),lot,Ask,slippage,clrWhite);  

   }     
      
  }
//+------------------------------------------------------------------+
bool SymOrder()
{
   for(int i=0; i<OrdersTotal(); i++)
      {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) return false;
      }

   return true;
}
 
Roman Sharanov:

Ajuda com a EA, como sempre o problema é provavelmente trivial, mas ainda não resolvi o enigma

Deve abrir comprar seema>smma deema ou não chegar ao seuponto(mesmo para vender). Deve fechar o negócio no fechamento do bar - abrir um novo bar. O próximo abre da mesma forma, mas com uma condição acima dopreço de abertura do anterior, que é opreço_da_ordem_última_venda.

Mas no final, abre onde quer e fecha. (No início do teste ele abre e fecha imediatamente)

Como posso sugerir? Salve seu código na prancheta, escreva-o no Expert Advisor e execute-o no testador de estratégia? Bem, farei com que ela se abra e feche. E daí? Talvez eu faça uma demonstração - hoje é sábado, amanhã é domingo, o mercado está fechado. Posso examiná-los com meus olhos? Bem, você tem que ter em mente os valores de todas as variáveis. Havia antes um método de depuração com lápis e papel - experimente-o. Você também pode colocar um Alerta("Bid=", Bid, Fast+P=",Fast_Ema+point*_Point," ....) antes de todo o OrderSelect e OrderClose e definir um dia no testador, por exemplo, de 19 a 20 de fevereiro e depois do teste para abrir o registro, fazer uma cópia, remover linhas desnecessárias e analisar. O MetaEditor também tem um recurso de depuração. Quando você aprende a depurar ... será ótimo.
 

Onde ele tem um botão?

Você pode me dizer como alinhar o texto no controle CSpinEdit de #include <Controls\SpinEdit.mqh> (campo de texto com incremento).

Por padrão, está alinhado à borda esquerda, mas quero que esteja alinhado à direita.

Razão: