Помогите решить идиотскую проблему - страница 3

 
shumaher9:

У меня это выглядит так,

стоит счетчик ордеров, выбирает ордер, определяет бай это или селл, потом оператором свич два кейса 0 и 1 соответственно под оп_бай и оп_селл.

Кейс 0 вызывает тралбай

Кейс 1 вызывает тралселл

Таким образом ордер и выбирается.


функции нижнего уровня пофиг, что вы там наверху выбрали, она не знает с каким ордером работать и OrderStopLoss() скорее всего у вас == 0

те ей нужно явно указать

 
valenok2003:функции нижнего уровня пофиг, что вы там наверху выбрали, она не знает с каким ордером работать

неправильная информация, у меня все прекрасно работает и не один год так:

//+------------------------------------------------------------------+
void CloseAllFirstProfit() {
   int i, k=OrdersTotal()-1;
   for (i=k; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
   k=OrdersTotal()-1;
   for (i=k; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}
//+------------------------------------------------------------------+
void ClosePosBySelect() {
   if (OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 10, CLR_NONE);
   if (OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 10, CLR_NONE);
}
//+------------------------------------------------------------------+
ЗЫ: почему топикстартер не хочет самостоятельно найти ошибку в своем коде с помощью вставки в свой print(.....) после каждого оператора? думаю продуктивнее будет, чем кусочки кусков кода выкладывать
 

Ок, это уже ближе к делу.

Правда трал отдельной функцией я сделал когда у меня возникла это проблема, до этого он был внутри кейс. А отдельной функцией я сделал что бы можно было ретурн использовать, как вариант делал типо: иф(новыйстоплосс<стоплоссордера) от ретурн.

 
Прин
IgorM:

неправильная информация, у меня все прекрасно работает и не один год так:

ЗЫ: почему топикстартер не хочет самостоятельно найти ошибку в своем коде с помощью вставки в свой print(.....) после каждого оператора? думаю продуктивнее будет, чем кусочки кусков кода выкладывать

принт это альтернатива алерт? Я так понимаю. Искал с помощью алерт, правда не после каждого оператора.

Вообщем я после 21 буду за основным компом и скину более полный код.

 

возможно и неправильная, однако тогда если в младшей функции вы измените ордер, он должен измениться и в старшей

А если есть необходимость на разных уровнях вложения выбирать на каждом свой ордер? Отработает корректно?

что-то я в документации этого не могу найти

 
shumaher9:

Ок, это уже ближе к делу.

Правда трал отдельной функцией я сделал когда у меня возникла это проблема, до этого он был внутри кейс. А отдельной функцией я сделал что бы можно было ретурн использовать, как вариант делал типо: иф(новыйстоплосс<стоплоссордера) от ретурн.


      for (i=1; i<=OrdersTotal(); i++)       //Цикл по всем ордерам,..     
         {                                        //отражённым в терминале
            if(OrderSelect(i-1,SELECT_BY_POS)==true && OrderProfit()>0)
               {
                  SLstop=MarketInfo(Symbol(),MODE_BID)+SL*MarketInfo(Symbol(),MODE_POINT);                  
                  //TPstop=MarketInfo(Symbol(),MODE_BID)-TP*MarketInfo(Symbol(),MODE_POINT);
                  //if(OrderTakeProfit()>TPstop){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TPstop,3,Red);}
                  if(OrderStopLoss()<SLstop){OrderModify(OrderTicket(),OrderOpenPrice(),SLstop,OrderTakeProfit(),3,Red);}               
                  
               }
         }
 
Может так ? ^ Для SELL. Для BUY минус воткнем
 

Вот у меня вообщем это все так

void TRAL()
{
if(TRAL==1)
{
for(int i=1; i<=OrdersTotal(); i++)                   
{ 
if(OrderSelect(i-1,SELECT_BY_POS)==true)             
{
if(OrderMagicNumber()!=magic) continue;             
int Tip=OrderType();
switch(Tip)
{
case 0:                               // тип ордера (0-buy,1-sell,4-buy stop,5-sell stop)                                         
CASE0();
case 1:
CASE1();
}
}
}
}
}

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

int CASE1()
{TralSell();}

int CASE0()
{TralBuy();}

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


void TralSell()
{
double SL1=iSAR(NULL,TFT,XT,YT,0)+Spread*Point;
if(Bars>=GlobalVariableGet(BarSell)+BarMax && OrderOpenPrice()-Ask<=Dist*Point && OrderOpenPrice()-Ask>6*Point)
{
bool Ans12=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-1*Point,Digits),NormalizeDouble(OrderTakeProfit(),Digits),0);
if(Ans12!=false)
{GlobalVariableSet(BarSell,Bars+100);}
}
if(LastBar1!=iTime(NULL,TFT,0) && OrderStopLoss()>SL1)
{                                                                                                                                                                                    
bool Ans1;                                              
Ans1=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL1,Digits),NormalizeDouble(OrderTakeProfit(),Digits),0); 
LastBar1=iTime(NULL,TFT,0); 
if(Ans1==false)                                        
{ Alert("Case1,Ордер ",OrderTicket()," не модифицирован");}      
}
}


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

void TralBuy()
{
double SL0=iSAR(NULL,TFT,XT,YT,0)-Spread*Point;
if(Bars>=GlobalVariableGet(BarBuy)+BarMax && Bid-OrderOpenPrice()<=Dist*Point && Bid-OrderOpenPrice()>6*Point)
{
bool Ans02=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+1*Point,Digits),NormalizeDouble(OrderTakeProfit(),Digits),0);
if(Ans02!=false)
{GlobalVariableSet(BarBuy,Bars+100);}
}

if(LastBar1!=iTime(NULL,TFT,0) && SL0>OrderStopLoss())
{                                                                                                                                                                                 
bool Ans0;                                              
Ans0=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL0,Digits),NormalizeDouble(OrderTakeProfit(),Digits),0); 
LastBar1=iTime(NULL,TFT,0); 
if(Ans0==false)                                        
{ Alert("Case1,Ордер ",OrderTicket()," не модифицирован");}      
}
}
 
shumaher9:

Вот у меня вообщем это все так

switch(Tip)
{
    case 0:                               // тип ордера (0-buy,1-sell,4-buy stop,5-sell stop)                                         
        CASE0();
        break;
    case 1:
        CASE1();
        break;
    default:
        break;
}
 
VladislavVG:


мне кажется эти break на погоду вообще не влияют
Причина обращения: