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 1100

 

Caros programadores, podem me ajudar a estabelecer uma proibição de abrir mais de uma série de negócios ao mesmo tempo (a série é se o pedido for fechado na perda ou zero e depois abrir o próximo negócio no mesmo instrumento, mas com um lote maior), ou seja, se você abrir uma série de negócios a segunda e subseqüente são colocados em outros instrumentos sob uma proibição (o bot funciona simultaneamente em instrumentos diferentes). Acho que deveria ser feito através de uma variável global em terminal, mas não tenho conhecimento e experiência suficientes, apenas comecei a aprenderMQL. Este é um conselheiro de opções binárias. Aqui está o código

Lotes duplos externos = 1; // Lotes

Exp = 1; // Expiração

externo int Espera = 1; // Número de castiçais de uma direção

Tempo esgotado externo int = 1; // Horário

duplo multiplicador externo = 3; // Multiplicador

Slippage externo int = 5; // Slippage

magia int externa = 2090; // Magia


int ticket, Tipo;

preço duplo, lote;

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

//| Função de iniciação de especialistas |

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

int OnInit()

{

return(INIT_SUCCEED);

}

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

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

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

nulo OnDeinit(const int razão)

{

}

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

//| função tick expert |

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

nulo OnTick()

{

// --------------- Comércios abertos ---------------

se (OrdensTotal() == 0) // Número de ordens deve ser igual a zero

{

if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELLL && PriceCloseLastHistOrder(OP_SELLL) > PriceOpenLastHistOrder(OP_SELLL))

// Se o último comércio estiver perdendo, o mesmo é aberto, mas com lote maior

{

Tipo = TypeLastHistOrder();

se (Tipo == OP_BUY) Preço = Perguntar;

se (Tipo == OP_SELL) Preço = Licitação;

Lote = NormalizeDuplo(LotsLastHistOrder()*Multiplier, 2);

bilhete = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)

// se o lucro do último comércio for igual a zero, o mesmo comércio será aberto

{

Tipo = TypeLastHistOrder();

se (Tipo == OP_BUY) Preço = Perguntar;

se (Tipo == OP_SELL) Preço = Licitação;

Lote = NormalizeDuplo(LotsLastHistOrder(), 2);

bilhete = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELLL && PriceCloseLastHistOrder(OP_SELLL) < PriceOpenLastHistOrder(OP_SELLL))

|| CountHistTrades() == 0)// Se a última negociação for lucrativa, a ordem é aberta

{

se (SignalBuy() && OrderTotal() == 0)

{

bilhete = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

se (SignalSell() && OrderTotal() == 0)

{

bilhete = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

Comentário ("PriceCloseLastHistOrder(OP_BUY)= ", PriceCloseLastHistOrder(OP_BUY), "PriceCloseLastHistOrder(OP_SELLL)=",

PriceCloseLastHistOrder(OP_SELLL) );

}

}

}

}

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

int CountTrades(int tipo = -1) // Determinar o número de operações

{

int cnt = 0;

para (int i=OrdensTotal()-1; i>=0; i--) // O laço passa por absolutamente todas as ordens abertas, i é o número da ordem

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // A função verifica se a ordem com o número de ordem i está no mercado,

// se houver, as seguintes condições são verificadas...

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type ||| type == -1)) // Se o símbolo

// o símbolo em que a ordem está aberta é igual ao símbolo atual, o tipo de ordem é igual a magia nos ajustes da EA atual, e

// o tipo de pedido é igual ao tipo (ou tipo == -1 (no caso de não importar qual tipo é necessário para a contagem do pedido))

cnt++; // 1 é adicionado à variável cnt e no final do loop cnt será igual ao número de negócios

// aberto pela EA atual para o par de moedas atuais com um determinado tipo

}

}

retorno(cnt); // o valor da variável cnt é retornado

}

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

int CountHistTrades(int tipo = -1)

{

int cnt = 0;

para (int i=OrdensHistóriaTotal()-1; i>=0; i--)

{

se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type ||| type == -1))

cnt++;

}

}

retorno(cnt);

}

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

bool SignalBuy()

{

para (int i=1; i<=Wait; i++)

{

se (Fechar[i] > Abrir[i]) retornar(falso)

}

if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Espera ||| (Espera == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

&& CountHistTrades() > 0) retorno(true);

se (CountHistTrades() == 0) retornar(true);

retorno(falso);

}

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

bool SignalSell()

{

para (int i=1; i<=Wait; i++)

{

se (Fechar[i] < Abrir[i]) retornar(falso)

}

if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Espera ||| (Espera == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

&& CountHistTrades() > 0) retorno(true);

se (CountHistTrades() == 0) retornar(true);

retorno(falso);

}

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

dataHoraHoraLastHistOrder(tipo int = -1)

{

data/hora da última vez = 0;

data/hora opentime = 0;


para (int i=OrdensHistóriaTotal()-1; i>=0; i--)

{

se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type ||| type == -1))

{

se (OrderCloseTime() > última vez)

{

lasttime = OrderCloseTime();

opentime = OrderOpenTime();

}

}

}

}

retorno(opentime);

}

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

int TypeLastHistOrder()

{

data/hora = 0;

tipo int = -1;

para (int i=OrdensHistóriaTotal()-1; i>=0; i--)

{

se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

se (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

{

se (OrderCloseTime() > tempo)

{

tempo = OrderCloseTime();

tipo = OrderType();

}

}

}

}

retorno(tipo);

}

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

double LotsLastHistOrder(tipo int = -1)

{

data/hora = 0;

lotes duplos = 0;

para (int i=OrdensHistóriaTotal()-1; i>=0; i--)

{

se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type ||| type == -1))

{

se (OrderOpenTime() > tempo)

{

tempo = OrderOpenTime();

tempo = OrderLots();

}

}

}

}

devolução(lotes);

}

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

duplo PriceCloseLastHistOrder(int tipo = -1)

{

data/hora = 0;

preço duplo = 0;

para (int i=OrdensHistóriaTotal()-1; i>=0; i--)

{

se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type ||| type == -1))

{

se (OrderCloseTime() > tempo)

{

tempo = OrderCloseTime();

preço = OrderClosePrice();

}

}

}

}

}

}

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

duplo PriceOpenLastHistOrder(int tipo = -1)

{

data/hora = 0;

preço duplo = 0;

para (int i=OrdensHistóriaTotal()-1; i>=0; i--)

{

se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type ||| type == -1))

{

se (OrderCloseTime() > tempo)

{

tempo = OrderCloseTime();

preço = OrderOpenPrice();

}

}

}

}

}

}

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

 
Olá, colegas!

Eu tenhouma pergunta enquanto programo: Existe alguma maneira de obter a precisão do tempo do servidor em milissegundos na EA?
Por exemplo, obtenha: 23.09.2016 14h. 53 min. 54000 milissegundos? Isso é exatamente 54 segundos, 000 milissegundos.
 
e-partner:
Olá colegas!

Tenhouma pergunta enquanto programo: é possível obter de alguma forma no Expert Advisor o tempo do servidor com uma precisão de milissegundos?
Por exemplo, obtenha: 23.09.2016 14h. 53 min. 54000 milissegundos? Isso é exatamente 54 segundos, 000 milissegundos.

Pergunta interessante. Como assim, especifique a última hora conhecida do servidor, a hora da última cotação TimeCurrent() ou a hora atual no servidor?

Se for TimeCurrent(), qual será o uso, se considerarmos que um pacote com uma nova cotação passa pela Internet do servidor para o terminal por 10-500 ms e este tempo varia de pacote para pacote. Além disso, não está claro, qual é a chegada da última cotação, se ela vem ao servidor de várias fontes, provedores de liquidez, e então é processada, e então o servidor envia um novo tick. Além disso, não se sabe como o temporizador do sistema do servidor é sincronizado com o tempo astronômico. Em 09.01.2014 das 04:15 às 06:15 MSK (quinta-feira, dia de negociação) eu estava descobrindo isto, pois o desvio não é astronômico, mas da média de 31 empresas. A figura para 25 pontos de tempo mostra estes desvios (em segundos, não ms):

E de que serve descobrir alguma coisa em milissegundos a partir dos dados do servidor?

A segunda opção é mais clara. Se seu computador está em sincronia com o tempo astronômico com uma precisão que você conhece, o tempo astronômico na cidade onde o servidor está rodando é conhecido com a mesma precisão. Mas por que você precisa disso...

 

Não consigo descobrir para onde foi a otimização a partir do testador de estratégia. Os cheques estão todos de pé e eu não consigo entender nada. MT4 build 1010. Janelas 8.1.

Favor aconselhar como permitir a otimização.

Vou anexar screenshots. Não consigo ver o botão de otimização.

Arquivos anexados:
desktop.zip  129 kb
 
Por que meu MT4 b1010 não permite a depuração de dados históricos (botão e item de menu não estão ativos)? No MT5 tudo está bem.
 
Porque os desenvolvedores o proibiram.
 
int Magik;
int Slippage = 5,stopL1 = 50,takeP1 = 20;
int trend,TicketS,TicketB;
duplo rsi,TP,SL;
//+------------------------------------------------------------------+
//| Função de inicialização do especialista |
//+------------------------------------------------------------------+
int OnInit()
{
if(Dígitos == 3 || Dígitos == 5)
{
Slippage *= 10;
stopL1 *= 10;
{ takeP1 *= 10;
}

return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Função de desinicialização especializada |
//+------------------------------------------------------------------+
nulo OnDeinit(const int razão)
{

}
//+------------------------------------------------------------------+
//| função tick expert |
//+------------------------------------------------------------------+
nulo OnTick()
{
double priseBuy = FindLastOrderPrise (OP_BUY);
double priseSel = FindLastOrderPrise (OP_SELLL);
double frezeelevl = MarketInfo(OrderSymbol(),MODE_FREEZELEVEL);
rsi = iRSI(Symbol(),PERIOD_D1,7,PRICE_CLOSE,0);
tendência = WhatTrend();
se (CountTrades() == 0)
{
if(trend === 1 && rsi <=30)
{
if(OrderSend(Symbol(),OP_BUYLIMIT,0.10,Ask,Slippage,0,0, "first buy order set",Magik,0)== verdadeiro)
{
TicketB = FindLastTicket(OP_BUY);
if(TicketB >0)
{
SL = priseBuy + NormalizeDouble(TakeP1 * Ponto,Dígitos);
TP = priseBuy - NormalizeDouble(stopL1 * Ponto,Dígitos);
if(OrderModify(TicketB,priseBuy,SL,TP,0)== verdadeiro)
Comentário ("hooraaaaahhhh");
}

}
}/// if(trend == 1 && rsi <= 30)
senão se(tendência == 2 && rsi >= 70)
{
if(OrderSend(Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0, "first order set",Magik,0)== verdadeiro)
{
for(int i = OrderTotal()-1;i >0;i--)
{
OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES);
if (OrderType()== OP_SELL && OrderMagicNumber() == Magik)
{
dupla fatia = OrderOpenPrice() + NormalizeDouble(stopL1 * Ponto,Dígitos);
duplo tp = OrderOpenPrice() - NormalizeDouble(takeP1 * Ponto,Dígitos);
if(OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)===verdadeiro)quebra;
caso contrário, continuar;
}
}
}
}
}/// (CountTrades() == 0)

}

Estou pedindo aos programadores competentes que expliquem qual é o meu erro...! Por que a ordem não é modificada!!! e o compilador não dá erros ao fazer isso

 
Eu estudei o tutorial. Eu li e tomei notas... você poderia apontar erros especificamente... porque o compilador não dá erros e não há erros no testador.mas a ordem não é modificada.como se a ordem não fosse visível no programa.
 
burbur87:
Eu estudei o tutorial. Eu li e tomei notas. Você poderia apontar os erros especificamente... porque o compilador não dá nenhum erro e não há erros no testador. Mas a ordem não é modificada. É como se a ordem não fosse vista no programa.

Leia atentamente o que OrderSend() retorna

 if(OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0) > 0)

Na verdade, eu faria o seguinte:

   int ticket=OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0);
   if(ticket>=0)
      {
        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
          {
            if (OrderStopLoss()==0 || OrderTakeProfit()==0)
             {
               double sl = OrderOpenPrice() + NormalizeDouble(stopL1 * Point,Digits);
               double tp = OrderOpenPrice() - NormalizeDouble(takeP1 * Point,Digits);
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)) Print("Error ",GetLastError()," modify order ",ticket);
             }
          }
      }
 
Sepulca:

Leia atentamente o que OrderSend() retorna

if(ticket>=0)

Na verdade, eu o faria desta maneira:

Um bilhete pode ser zero?