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 351

 
Por favor, ajude-me a corrigir os erros nesta função. Ele já me espremeu todo o suco. A essência da função, quando atinge um certo lucro, a função deve fechar metade da ordem.
void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
{
if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderProfit()>= NormalizeDouble (TP*Point,Digits))
{
if (OrderType() == OP_BUY)
double Lots = OrderLots();
double HalfLot = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);

if (OrderType() == OP_SELL)
double Lots1 = OrderLots();
double HalfLot1 = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
}
}
}
}

Ah, e como faço para que esta função funcione apenas uma vez por pedido aberto?
 
Trader7777:
Por favor, ajude-me a corrigir os erros nesta função. Ele já me espremeu todo o suco. A essência da função, quando atinge um certo lucro, a função deve fechar metade da ordem.
Ah, e como faço para que esta função funcione apenas uma vez por pedido aberto?
Você pode ver aqui o princípio do fechamento parcial dos pedidos.
 
Trader7777:
Por favor, ajude-me a corrigir os erros nesta função. Ele já me espremeu todo o suco. A essência da função, quando atinge um certo lucro, a função deve fechar metade da ordem.

void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
{
if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic){//Нефига тут профиту делать, это так, для убыстрения....

if(OrderProfit()>= NormalizeDouble (TP*Point,Digits)) //А тут вообще непонятки что с чем сравниваете....
{
if (OrderType() == OP_BUY)
double Lots = OrderLots();
double HalfLot = NormalizeDouble (Lots*0.5,2);// Тут озаботится чтобы лот не стал меньше минимального
OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);

if (OrderType() == OP_SELL)
double Lots1 = OrderLots();
double HalfLot1 = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
}
}
}

}


}

Ah, e como faço para que esta função funcione apenas uma vez por pedido aberto?
 
TarasBY:
Você pode ver aqui o princípio do fechamento parcial das ordens.

Obrigado. Mas eu ainda quero entender meus erros antes de tudo. Eu ainda estou aprendendo. Além disso, eu acho que estou muito próximo da verdade.

 

mais uma vez... A função não está funcionando. Eu quero entender os erros. + como fazê-lo acionar apenas 1 vez para 1 ordem aberta? Muito obrigado de antemão)

extern int TP         = 200; // это количество пунктов после которых должно произойти частичное закрытие
extern int Magic      = 77;


void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
  {
    if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
      {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderProfit()>= NormalizeDouble (TP*Point,Digits))
          {
            if (OrderType() == OP_BUY) 
            double Lots = OrderLots(); 
            double HalfLot  = NormalizeDouble (Lots*0.5,2); // изначально ( при открытии ордера) лот рассчитывается так, что он не может быть меньше чем 0,02
            OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);
          
            if (OrderType() == OP_SELL)
            double Lots1 = OrderLots(); 
            double HalfLot1  = NormalizeDouble (Lots*0.5,2);
            OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
          }
        }
      }
    }
 
Trader7777:

mais uma vez... A função não está funcionando. Eu quero entender os erros. + como fazê-lo acionar apenas 1 vez para 1 ordem aberta?


A condição de uma vez para uma encomenda não é muito clara. Bem, provavelmente teremos que usar variáveis globais aqui. Talvez haja mais de um pedido, e apenas uma vez para cada um?
 
Trader7777:

mais uma vez... A função não está funcionando. Eu quero entender os erros. + como fazê-lo acionar apenas 1 vez para 1 ordem aberta?

Filtrar por tamanho de lote
 

Eu tenho a seguinte situação. Há vários módulos no EA, cada módulo assume várias funções personalizadas. A fim de não me afogar no código, decidi colocar cada módulo em scripts. Aqui está a variante de chamar o roteiro do Expert Advisor. O próximo problema surge, no entanto: ao chamar o roteiro, preciso passar alguns parâmetros para ele. Podemos utilizar variáveis globais. Que outras variantes podem ser sugeridas?

Deixe-me dizer-lhe desde já: a variante "mais simples" via iCustom() não me convém, por duas razões. Em primeiro lugar, a chamada do módulo deve ser ocasional na memória, não constante. Em segundo lugar, não utilizo matrizes indicadoras.

 
Sepulca:

A condição de uma vez para uma encomenda não é muito clara. Bem, você provavelmente terá que usar variáveis globais aqui. Pode haver várias encomendas e apenas uma vez para cada uma?

Só pode haver uma ordem no mercado. No momento, esta função não funciona de forma alguma... por alguma razão. Mas se funcionar corretamente, entendo que será acionado o tempo todo, desde que o lucro seja maior do que a quantidade definida de pips. É claro que precisamos que ele feche metade de uma posição uma vez, e é isso. Mas eu gostaria que funcionasse pelo menos uma vez).
 
gyfto:

Eu tenho a seguinte situação. Há vários módulos no EA, cada módulo assume várias funções personalizadas. A fim de não me afogar no código, decidi colocar cada módulo em scripts. Aqui está a variante de chamar o roteiro do Expert Advisor. O próximo problema surge, no entanto: ao chamar o roteiro, preciso passar alguns parâmetros para ele. Podemos utilizar variáveis globais. Que outras variantes podem ser sugeridas?

Deixe-me dizer-lhe desde já: a variante "mais simples" via iCustom() não me convém, por duas razões. Em primeiro lugar, a chamada do módulo deve ser ocasional na memória, não constante. Em segundo lugar, não utilizo matrizes indicadoras.


Uma biblioteca é uma opção.