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 1067

 

Ajude, por favor! Existem 2 arquivos: um indicador e um Expert Advisor. Como se referir corretamente à função no indicador via #include? iCustom não é adequado por várias razões. Isto é o que escrevi no indicador:

bool BuyTrue(double& переменная, int переменная) export
{
   //тело функции

   return(true);
}   

E isto é o que escrevi no Expert Advisor:

#import "НазваниеИндикатора.ex4"
   bool BuyTrue(double& переменная, int переменная);
if (BuyTrue(переменная, переменная))
Opn_B = true;

Mas por alguma razão, o consultor especializado não funciona, o indicador não aparece na tabela de preços durante os testes. Eu o escrevi corretamente e, se houver um erro, onde ele está?

 
AlexeyVik:

Tuta.


Eu não tenho um. Mas definitivamente existe um arquivo em algum lugar, eu recebo as informações registradas nele.


 

Por favor, ajude-me a compilar para o mt4

FileClose' - expressão do tipo 'void' é ilegal TickToCVS~.mq4 84 12

Arquivos anexados:
 
abeiks:

Eu não tenho um. Mas definitivamente existe um arquivo em algum lugar e eu recebo as informações registradas nele.


Minha captura de tela mostra que o menu é do MetaEditor e sua captura de tela é do MT.
 
AlexeyVik:

Este é o valor VAZIO_VALOR

Procure onde ela está aparecendo.

Obrigado. Vocês me ajudaram a resolver o problema. Meu indicador, quando carregado, calcula as barras a partir da primeira, não a partir de zero (eu fiz de propósito), a partir de zero calcula sobre o histórico de tick, não sobre os dados históricos. Agora, quando mudo o cronograma, anexo-o ao gráfico e reinicio o terminal, reajusto os valores do buffer para zero na barra 0, problema resolvido.
 
AlexeyVik:
Minha captura de tela mostra que o menu é do MetaEditor e sua captura de tela é do MT.
Certo! Obrigado!
 
Como posso obter o preço de abertura de uma ordem na história e não o preço de uma posição aberta se esta ordem foi acionada? Na função anexa, se uma ordem foi acionada, esta ordem só pode ser encontrada em posições, portanto não funciona. E nas posições temos apenas o preço da posição aberta, mas não o preço do pedido.
double GetPriceLastCloseOrder(string sy="", int mn=-1) {
  datetime t=0;
  int      i, k=OrdersHistoryTotal(); 
  double r=0;

  if (sy==NULL) sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()>1 && OrderType()<6) {
          if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            r=OrderOpenPrice();
          }
        }
      }
    }
  }
  return(r);
}  
 

Oi pessoal, minha pergunta é: não posso modificar um pedido. Há dois aspectos, não entendo a matemática da modificação, então, por favor, me explique.

A meu ver, SL= IF ORDERSELEKT,Bid-ORDERSTOPLOS*POINT,DIGITS

o segundo aspecto.aprendido com o vídeo XBMS

como eu não tentei mudar os valores das variáveis no tester eror 130 não a parada correta de perda e merdas como esta

2016.06.28 21:42:23.402 2016.06.23 00:00 entradas RSI comerciais: Lotes=0,1; Slippage=5; StopLoss=10; TakeProfit=30; RSIPeriod=7; Magic=1087;

embora haja uma multiplicação a partir de dígitos e função no caso de SL errado


Lotes duplos externos = 0,1;

Escorregão externo = 10;

StopLoss int externo = 10;

Exterior int TakeProfit =30;

período RSIP int externo = 7;

magia int externa =1087;

duplo MaRSI;


int TP,SL;

bool tfu;


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

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

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

int OnInit()

{

if(Dígitos == 3||Dígitos == 5)

{

Slippage *= 10;

TakeProfit *= 10;

StopLoss *= 10;

}

return(INIT_SUCCEED);

}

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

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

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

nulo OnDeinit(const int razão)

{


}

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

//| função tick expert |

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

nulo OnTick()

{

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

//venda aberta

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

MaRSI=iRSI(Symbol(),0, RSIPeriod,PRICE_CLOSE,1);

if(CountTrades() <= 0&MaRSI<=30 )

{

if( EnviarOrder(Símbolo(),OP_BUY,Lots,Ask,Slippage,0,0, "teste",Magia,0,Verde))

{ bilhete int = OrderTicket();

SL = NormalizeDouble( Pergunte - StopLoss*Point,Dígitos);

TP = NormalizeDuplo( Ask + TakeProfit*Point,Dígitos);

ModifyOrder(ticket,OrderOpenPrice(),SL,TP,0,Black);

}

}// if(CountTrades <= 0&MaRSI>=70 )

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

//abrir a compra

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


}//ONTICK


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

//+ contador de pedidos

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


int CountTrades ()

{

int count = 0;

for(int i = OrderTotal()-1;i>=0;i--)

{

if( OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

{

if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)// se o pedido for nosso

contador++;//contador de aumento

}//selecionar ordem por índice

}// encomenda.i===primeira encomenda.

devolução(contagem);// devolve o número de pedidos

}// função

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

// função de colocação de pedidos com manipulação de erros

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

int SendOrder( símbolo de corda, int cmd, volume duplo, preço duplo, int slippage, stoploss duplo,

double takeprofit,string comment,int magic=0,datetime expiration=0,color arrow_color=CLR_NONE)

{

int err = GetLastError();

err =0;

bool exit_cikl = falso;

int ticket = -1;

int Retry = 10; //número de tentativas para estabelecer uma ordem

int cnt = 0; //entrada contagem

if(cmd == OP_BUY || cmd == OP_SELL)

{

while(!exit_cikl)

{

bilhete = OrderSend(symbol,cmd,volume,preço,slippage,stoploss,takeprofit,comment,magic,expiration,arrow_color);

err= GetLastError();

switch(err)

{

caso ERR_NO_ERROR:

exit_cikl = verdadeiro;

pausa;

{ caso ERR_SERVER_BUSY:

caso ERR_NO_CONNECTION:

caso ERR_INVALID_PRICE:

caso ERR_OFF_QUOTES:

caso ERR_BROKER_BUSY:

caso ERR_TRADE_CONTEXT_BUSY:

cnt++;

pausa;

caso ERR_PRICE_CHANGED:

caso ERR_REQUOTE:

RefreshRates();

continuar;

padrão:

exit_cikl = verdadeiro;

pausa;

}// interruptor(err)

if(cnt > Retry)

exit_cikl = verdadeiro;

if(!exit_cikl)

{

Sleep(1000);

RefreshRates();

}// se não sairmos do laço se(!exit_cikl)

senão

{

if(err != ERR_NO_ERROR)

{

Print("Error : " " + IntegerToString(err));

}// se ainda houver um erro se(err != ERR_NO_ERROR)

}// OUTROS

if(err==ERR_NO_ERROR)

{

if( OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==verdadeiro)

retorno(bilhete);

}// if(err==ERR_NO_ERROR)

Imprimir("Ordem de abertura de erro após " + IntegerToString(cnt) +"tentativas");

retorno(-1);

} // ciclo enquanto

}// se o tipo de pedido for Compra ou Venda

retorno(bilhete);

}// Função SendOrder


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

//função modificar ordem

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

ModifyOrder(int ticket,double price,double stoploss,double takeprofit,datetime expiration,colour arrow_color)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

{

preço = NormalizeDuplo(preço,Dígitos);

stoploss = NormalizeDuplo(stoploss,Dígitos);

takeprofit = NormalizeDuplo(takeprofit,Dígitos);

CheckValidStop(Symbol(),price,stoploss);//função para alterar a parada mínima

int err = GetLastError();

err = 0 ;

int Retry = 10;

int cnt = 0;

bool exit_cikl = falso;

resultado da bool;

while(!exit_cikl)

{

resultado = OrderModify(ticket, preço,stoploss,takeprofit,expiração, arrow_color);

err = GetLastError();

if(resultado == verdadeiro)

{

Print("Order #"+ IntegerToString(ticket), "modificado com sucesso");

retorno(verdadeiro);

}

switch(err)

{

caso ERR_NO_ERROR:

exit_cikl = verdadeiro;

pausa;

{ caso ERR_SERVER_BUSY:

caso ERR_NO_CONNECTION:

caso ERR_INVALID_PRICE:

caso ERR_OFF_QUOTES:

caso ERR_BROKER_BUSY:

caso ERR_TRADE_CONTEXT_BUSY:

cnt++;

pausa;

caso ERR_PRICE_CHANGED:

caso ERR_REQUOTE:

RefreshRates();

continuar;

padrão:

exit_cikl = verdadeiro;

pausa;

}// interruptor(err)

}// while(!exit_cikl)

se ( err != ERR_NO_ERROR)

{

Imprimir("Erro ao modificar ordem # " + IntegerToString(ticket));

Imprimir("Código de erro: "+ IntegerToString(err));

}

}//(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

senão

{

Imprimir("Seleção do pedido falhou, ticket = " + IntegerToString(ticket));

retorno(falso);

}// se algo correr mal

retorno(verdadeiro);

}// função modificar

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

//ChtckValidStop

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

Válido CheckValidStop(símbolo de corda, preço duplo, double& sl)

{

if(sl==0)

retornar;

duplo min_stop_server = MarketInfo(símbolo,MODE_STOPLEVEL)*MarketInfo(símbolo,MODE_POINT);

if(MathAbs(price-sl) <= min_stop_server)

{

if(preço>sl)

sl = preço - min_stop_server;

else sl = sl + min_stop_server;

}// if(MathAbs(price-sl) <= min_stop_server)

sl = NormalizeDouble(sl,MarketInfo(símbolo,MODE_DIGITS))

}// função


 

POR FAVOR, AVISE!!!!

Há duas ordens no histórico de negociação: 1) SELL № tic 415 STOPLOSS 1.1000 lote 0.01 2) SELL № tic 418 STOPLOSS 1.1000 lote 0.02

Tenho que atribuir as variáveis X=tick, Y=STOPLOSS e B=lot se o preço Asc for igual ao STOPLOSS da ordem de venda. Como atribuir os primeiros valores à primeira ordem, e depois à segunda ordem. Comigo ele sempre atribui um valor à primeira encomenda.

 
m8akca:

POR FAVOR, AVISE!!!!

Há duas ordens no histórico de negociação: 1) SELL № tic 415 STOPLOSS 1.1000 lote 0.01 2) SELL № tic 418 STOPLOSS 1.1000 lote 0.02

Tenho que atribuir as variáveis X=tick, Y=STOPLOSS e B=lot se o preço Asc for igual ao STOPLOSS da ordem de venda. Como atribuir os primeiros valores à primeira ordem, e depois à segunda ordem. Comigo ele sempre atribui um valor à primeira encomenda.

Este tópico foi concebido para ajudar aqueles que já têm algo escrito, mas não funciona da maneira que eu gostaria que funcionasse. Por favor, envie seu código para que os outros aqui possam ver o que está errado e ajudar.

E se você quiser ser escrito sob encomenda, é aí que está.

Razão: