Problema com o código EA 2 (gerente SL) - página 4

 
diostar:

Espero que isto possa oferecer alguma ajuda.

Inicialmente, meus símbolos tinham 4 dígitos, todos os trailing stops, ordens de parada/limite modificadas, foram exatamente como esperado. Então, meu corretor decidiu ir fracionário. Eu fiz as mudanças necessárias e vi meus pips ficarem como -3,4, -4,5, 0,1, 4,6, 7,3, etc, etc. Pensei que estava tudo bem, mas na verdade não: Suponha que eu estabelecesse meu limite=7, e digamos, o novo tick 1,tick 2,tick 3 acontece sequencialmente:

1) 7,3>limite, então o pedido é modificado... corretor preenche 1 deslize...

2) 7,5>limite, depois o pedido é modificado.... corretor preenche 0 derrapagem...

3) 7.1>limite, depois o pedido é modificado...corretor preenche 2 deslizes...

Assim, no total, recebo meus pedidos modificados 3 vezes para todos os 3 carrapatos. Tendo percebido isso, decidi usar MathRound() para arredondar aqueles para o inteiro mais próximo, então 1,2,3 torna-se

1) matemático(7.3) =7 >limite, NÃO VERDADEIRO, não modificado

2) matemático(7.5)=8 >limite, VERDADEIRO, a ordem é modificada

3) matemático(7.1)=7>limite, NÃO VERDADEIRO, não modificado

Na verdade, ainda estou trabalhando em como melhorar o acima mencionado... até agora eles estão trabalhando bem, mas acho que deve haver maneiras melhores do que a minha.


Diostar incrível, essa é uma informação muito útil para mim na verdade, especialmente aquele pedaço que eu salientei.

Portanto, se eu resolver meu problema, o melhor que eu posso esperar é:

cada vez que minhas condições são satisfeitas no intervalo 00, 01, 02 etc, o melhor que posso esperar é 1,2,3 (respectivamente) rolagem de cada hey. Então, na lacuna 03 modificará meu pedido 02,01,00, depois 01,00,02, depois 00,02,01 até que todos os pedidos sejam modificados? Se eu os rolo para frente a mesma coisa, mas ordem diferente etc...

Acho que posso ficar bem se isso acontecer de fato... no entanto, posso encontrar o mesmo que você mais tarde e querer apertar, mas fico feliz em enfrentar uma ponte de cada vez... Mas obrigado pela previdência!!

ainda estou prestes a tentar aquele fórum...

 
essa fórmula também correu bem, obrigado pelo apoio ali Diostar, eu estava perseguindo minha cauda por anos aprendendo código, obrigado...
 

Como sempre, em retrospectiva, para pensar em uma solução diferente.....

Só para minha aprendizagem, o bloco abaixo funcionaria como uma alternativa de trabalho para o meu problema antes?


//---------------------------old attempt where it spammed modifies--------------------------------------
//---------------------------I got around this problem another way before-------------------------------
void ModifySellBlock()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

//-----------------------------however I am wondering now that I have fixed it------------------
//------------------------------would this of worked below?-------------------------------------

void ModifySellBlock()
{
    int orderstotal = OrdersTotal();
    int orders = 0;
    int ordticket[30][2];
    for (int i = 0; i < orderstotal; i++)
    {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if (OrderType() != OP_SELL || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
        {
            continue;
        }
        ordticket[orders][0] = OrderOpenTime();
        ordticket[orders][1] = OrderTicket();
        orders++;
    }
    if (orders > 1)
    {
        ArrayResize(ordticket,orders);
        ArraySort(ordticket);
    }
    for (i = 0; i < orders; i++)
    {
        if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
        {
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

//--------------------------any problems with this block?----------------------------------------------
 
 
//-----------------------------however I am wondering now that I have fixed it------------------
//------------------------------would this of worked below?-------------------------------------

void ModifySellBlock()
{
    int orderstotal = OrdersTotal();
    int orders = 0;
    int ordticket[30][2];<-----then, arrayinitialize
    
    for (int i = 0; i < orderstotal; i++)
    {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);<-----if(orderselect...

        if (OrderType() != OP_SELL || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
        {
            continue;
        }
        ordticket[orders][0] = OrderOpenTime();
        ordticket[orders][1] = OrderTicket();
        orders++;
    }
    if (orders > 1)<----orders >0
    {
        ArrayResize(ordticket,orders);
        ArraySort(ordticket);
    }
    for (i = 0; i < orders; i++)
    {
        if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)<---if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET)

        {
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;      
         
            can consider if(SL>0 || TP>0){
          
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}
 
diostar:


Obrigado por seu tempo com esse Diostar. Na época, eu não tinha o conhecimento para ter sequer tido esta idéia. Mesmo agora eu meio que a remodelei a partir de alguns pedacinhos de código, pois ainda estou aprendendo a fazer ARRAYS...

Honestamente não posso acreditar como foi difícil fazer uma seção de código, que apenas SELECIONE TODOS OS PEDIDOS, e MODIFICA-SE UMA VEZ... se o fluxo de dados fosse enviado para cá TODOS...

Eu aprecio seu tempo com suas adições, eu vou dar-lhes uma oportunidade... Ei também Diostar, acredito que também estou percebendo o que você disse antes, obrigado pela previsão, então sei que não era meu código.... Eu vejo rolando pelas modificações (* # pedidos que tenho), e noto um deslize... eu o manterei informado se eu contornar isto, possivelmente com o código acima como um começo para ser honesto, obrigado novamente ;)

 
Funky:


Obrigado por seu tempo com esse Diostar. Na época, eu não tinha o conhecimento para ter sequer tido esta idéia. Mesmo agora eu meio que a remodelei a partir de alguns pedacinhos de código, pois ainda estou aprendendo a fazer ARRAYS...

Honestamente não posso acreditar como foi difícil fazer uma seção de código, que apenas SELECIONE TODOS OS PEDIDOS, e MODIFICA-SE UMA VEZ... se o fluxo de dados fosse enviado para cá TODOS...

Eu aprecio seu tempo com suas adições, eu vou dar-lhes uma oportunidade... Ei, Diostar, acredito que também estou percebendo o que você disse antes, obrigado pela previsão, então sei que não era meu código.... Eu vejo rolando pelas modificações (* # pedidos que tenho), e noto um deslize... eu o manterei informado se eu contornar isto, possivelmente com o código acima como um começo para ser honesto, obrigado novamente ;)

Seja bem-vindo. Slippage, assim como o spread, faça fora de cotação o resultado em qualquer preço de modificação, sl, tp. Mas eu sempre encomendo () com slippage zero, ainda assim. Pode ser bom ter 1,2 pontos, mas até agora, tão bom.