[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 190

 

Sergey Dubakin gentilmente ofereceu a função CloseBy, mas infelizmente ela não satisfaz a condição importante para eu fechar uma posição com um prejuízo máximo com a posição oposta com um lucro máximo:


avatar
19
Diubakin 25.02.2013 23:26
borilunad:
Uv. pro! Onde posso encontrar a função СloseBy() que funciona em modo manual? Quero inseri-lo em minha coruja para poder não manualmente, mas automaticamente de acordo com as condições para fechar a posição com um máximo menos o oposto com um máximo mais. Não consegui encontrá-lo na base de código. Não o encontrei no codebase. Obrigado!

Experimente esta variante:

bool LockOFF(int posit, int oppos, color arrow_color) {
double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие"); return(false); }
 
 return(true); }

Eu fiz funções que definem maxloss GetMaxLoss() e maxprofit GetMaxProfit(), mas não posso fazer LockOFF() selecionar um par que especifiquei em vez de qualquer um deles. Por favor me mostre em que lugar colocar meus máximos, e talvez eu precise de mais funções para determinar o ingresso ou índice dessas posições, então não é um problema para mim, mas onde colocar tudo isso neste LockOFF()? Obrigado!

 
borilunad:

Sergey Dubakin gentilmente ofereceu a função CloseBy, mas infelizmente ela não satisfaz uma condição importante para mim, ou seja, fechar uma posição com uma perda máxima por uma posição oposta com um lucro máximo.

Olá, esta função fecha uma posição com uma perda máxima com a posição oposta com um lucro máximo. Aqui está um teste EA para o testador:

extern int EA_Magic=135; // внешняя переменная

int TimeNow, TimePrev, PrevType; // глобальные переменные

int start()
 {
  double Price,SL,TP;
     int Ticket;

  TimeNow=iTime(NULL,240,0);
  if(TimePrev==TimeNow) return(0);

  if(PrevType!=1) {
   Price=NormalizeDouble(Ask,Digits);    
   SL=NormalizeDouble(Price-300*Point,Digits);    
   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }

  else if(PrevType!=-1) {
   Price=NormalizeDouble(Bid,Digits);    
   SL=NormalizeDouble(Price+300*Point,Digits);    
   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,SL,TP,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }

  if(Hour()==0 && TimePrev==TimeNow) LockOFF(EA_Magic);

  return(0);
 }

bool LockOFF(int EA_Magic) {
 double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие!"); return(false); }
 
 return(true); }

Abre posições de Compra e Venda alternadamente quando uma nova barra de 4 horas aparece e faz com que uma barra oposta feche quando um novo dia abre.

 
Diubakin:

Olá, a função fecha a posição com a perda máxima com a posição oposta com o lucro máximo. Aqui está um teste EA para o testador:

Abre posições de Compra e Venda alternadamente quando uma nova barra de 4 horas aparece e faz com que uma barra oposta feche quando um novo dia abre.

Olá Sergey, eu tenho um algoritmo diferente! A questão é que esta função fecha o que tem, e eu preciso dela para fechar o máximo, não nenhuma! Bem, nada, eu mesmo o terminarei se ninguém me ajudar! Sua versão só é boa para o testador, portanto, adicionada ao cabeçalho de acordo com as regras. Funciona bem sem erros, mas não seleciona o máximo! Mesmo assim, obrigado por sua ajuda!
 
alsu:

É isso aí, já está. Se o preço na barra atual atingir Open[0] + 30, então abrimos. Se a barra terminou, Open[0] mudou e o nível aberto é deslocado de acordo. Deve haver apenas um comércio no mercado, certo?

Então é assim:

Não há necessidade de rastrear a nova barra, pois quando ela for formada, o sistema automaticamente adicionará um novo valor ao Open[0] e isto significa que o novo nível será calculado corretamente. Favor observar que o negócio de COMPRA é aberto ao preço Ask atual, enquanto é fechado (TP e SL) ao preço Bid. Além disso, os valores dos preços devem ser normalizados.


Muito obrigado por sua ajuda.

Mas abre negócios no testador a cada minuto de vela. As informações estão neste link http://clip2net.com/s/2T98Y

Quero que ele abra um pedido em um castiçal de cinco minutos,mas não em todos os castiçais.

Mas somente se o castiçal atual de cinco minutos for > ou = 30 pips (do preço aberto ao seu máximo).

Ou seja, abrir uma ordem de mercado no trigésimo ponto a partir do preço de abertura da vela de cinco minutos zero=actual.

E se o período atual de cinco minutos desde o preço aberto até seu máximo for inferior a 30 pontos, não devemos abrir uma ordem de mercado.

Isto é, as encomendas serão um pouco, eu conto em Excel, desde 1999 - um pouco mais de 3.000 em euro-dólares em ambas as direções.

Mudamos para o próximo período de cinco minutos e se ele, ou seja, o período atual de cinco minutos > ou = 30 pips, então abrimos no trigésimo pips, se menos, mudamos para o próximo período de cinco minutos ... e assim por diante até o final do gráfico.

Mas a coisa é que, por uma estimativa aproximada, a maioria dos pentaminós que > ou = 30 pips estão voando mais frequentemente do que 15 pips do que se fechando por uma parada de 30 pips.

Você tem uma condição - se não houver ordens em aberto

Mas em meu sistema, dois períodos de cinco minutos com os parâmetros descritos acima podem ser formados em uma fila e se a ordem do período anterior de cinco minutos não for fechada, então nenhuma ordem será aberta no segundo período de cinco minutos.

Eu preciso que uma ordem seja aberta a cada cinco minutos com os parâmetros descritos acima, independentemente de haver ou não ordens no comércio.

 
if (OrdesTotal()==0 && Close[0]>=Price)  
 
alsu:

É isso aí, já está. Se o preço na barra atual atingir Open[0] + 30, então abrimos. Se a barra terminou, então Open[0] mudou e o nível de abertura é deslocado de acordo. Deve haver apenas um comércio no mercado, certo?

Então é assim:

Não há necessidade de rastrear a nova barra, pois quando ela for formada, o sistema automaticamente adicionará um novo valor ao Open[0] e isto significa que o novo nível será calculado corretamente. Favor observar que o negócio de COMPRA é aberto ao preço Ask atual, enquanto é fechado (TP e SL) ao preço Bid. Além disso, os valores dos preços devem ser normalizados.


E você também tem uma segunda condição - se o preço fechado dos cinco minutos atuais >= preço aberto do pedido.

Mas em minha idéia o preço de fechamento do período atual de 5 minutos pode ser qualquer preço, desde que seu Alto seja > ou = 30 pips.


Close[0]>=Price

 
borilunad:
Olá Sergei, eu tenho um algoritmo diferente! Essa é a questão, essa função fecha o que tem e eu quero que feche as máximas, não nenhuma! Bem, nada, eu mesmo o terminarei se ninguém me ajudar! Sua versão só é boa para o testador, portanto, adicionada ao cabeçalho de acordo com as regras. Funciona bem sem erros, mas não seleciona o máximo! Mesmo assim, obrigado por sua ajuda!

Como você o quer? O que eu afixei determina a posição mais não lucrativa na moeda do depósito(em dinheiro), depois determina a posição oposta mais lucrativa também na moeda do depósito e faz um contra-fechamento.

borilunad:

Eu implementei funções que determinam a maxloss GetMaxLoss() e maxprofit GetMaxProfit() mas não posso fazer a função LockOFF() selecionar um par especificado por mim e não qualquer um deles. Por favor me mostre em que lugar colocar meus máximos, e talvez eu precise de mais funções para determinar o ingresso ou índice dessas posições, então não é um problema para mim, mas onde colocar tudo isso neste LockOFF()? Obrigado!

A função tem tudo - definindo o prejuízo máximo, o lucro máximo, o bilhete também é definido.

 
Diubakin:

Como você o quer? A que você postou, determina a posição mais não lucrativa na moeda do depósito (em dinheiro), depois determina a posição oposta mais lucrativa também na moeda do depósito e faz uma contra-fecha.

A função tem tudo - define perda máxima, lucro máximo, o bilhete também é definido.

Você está errado! Provavelmente você tem o único par de posições opostas, enquanto eu posso ter mais. É por isso que coloco todos os dados em comentários e vejo que fecha não o maxiLoss maxiProfit, mas qualquer um dos primeiros que eu encontrar. E minhas funções mostram claramente os índices de posição com máxima Perda e Lucro. Resta apenas acrescentar estes cheques à LockOFF()!
 
borilunad:
Você está errado! Você provavelmente tem o único par de posições opostas, enquanto eu posso ter mais, porque exibi todos os dados nos comentários e vejo que fecha não o maxiLoss maxiProfit, mas qualquer um dos primeiros que aparecem na busca. E minhas funções mostram claramente os índices de posição com máxima Perda e Lucro. Eu só preciso acrescentar estes cheques à LockOFF()!
Você já viu o teste EA para esta função no testador? Fecha exatamente o prejuízo máximo com lucro máximo, não importa quantos pedidos existam - dois ou vinte.
 
Vinin:

https://www.mql5.com/ru/code/7835 Somente este é um indicador. Você tem que usar objetos em um EA.
É o Expert Advisor que me interessa, objetos - devo eu mesmo desenhar uma vela?
 
Diubakin:
Você já examinou o teste EA para a função no testador? Encerra exatamente o prejuízo máximo com lucro máximo, não importa quantas encomendas existam - duas ou vinte.
É claro que sim! É verdade, eu não tenho mais de três. Procurei em todos os lugares, no testador nos resultados e no diário, na demonstração e também no gráfico! Quando eu o fizer, eu lhe mostrarei!
Razão: