Нужна подсказка программиста - страница 2

 
space_cowboy >>:

ну правильно всё, тело цикла не выполнится ни разу т.к. OrdersTotal()=0, а цикл у тебя от 0 до OrdersTotal() исключительно

делай так:


for (i=OrdersTotal()-1;i>=0;i--)

Лучше так. Будет гораздо быстрее работать. В Вашем примере функция будет вызываться при каждом сравнении, на каждой итерации, в этом только один раз.

Успехов.

 
VladislavVG >>:

Лучше так. Будет гораздо быстрее работать. В Вашем примере функция будет вызываться при каждом сравнении, на каждой итерации, в этом только один раз.

Успехов.

Сделал каждый блок вот таким образом

//===========================================================1.4000================================================
     double Z=1.4000;
     if (MathAbs(Ask-(NormalizeDouble(Z,4))-0.0015)<=Delta*Point)// попадание в область +-Delta пунктов он цели     
      {for (i=OrdersTotal()-1;i>=0;i--)
         {OrderSelect(i,SELECT_BY_POS, MODE_TRADES);
             if (OrderMagicNumber()!=400)
                    OrderSend(Symbol(),OP_BUYLIMIT,lot,(NormalizeDouble(Z,4)),3,Ask-(SL+15)*Point,Ask+(TP-15)*Point,"My order #"+i,400,0,Green);                
}}



Теперь открываются почему-то тысячи отложенных ордеров по цене 1.4000
 
dem220 >>:

Сделал каждый блок вот таким образом



Теперь открываются почему-то тысячи отложенных ордеров по цене 1.4000

Ну а что Вы хотели то ? Где контроль ошибок ? Что делает Ваш алгоритм, если ордер не отмечен (функция ОрдерСелект вернула "ложь") ? - спокойно выставляет следующий ордер, поскольку магик там явно не 400 - будет какой-то мусор....

double Z=1.4000;

     if (MathAbs(Ask-(NormalizeDouble(Z,4))-0.0015)<=15*Point)// попадание в область +-Delta пунктов он цели     
     {
         int n_ord = OrdersTotal();
         if(n_ord==0) 
             OrderSend(Symbol(),OP_BUYLIMIT,lot,(NormalizeDouble(Z,4)),3,Ask-(SL+15)*Point,Ask+(TP-15)*Point,"My order #"+i,400,0,Green);  
         else
         for (int i= n_ord-1;i>=0;i--)
         {
             if(!OrderSelect(i,SELECT_BY_POS, MODE_TRADES)) break;
             if(OrderMagicNumber()!=400)
                    OrderSend(Symbol(),OP_BUYLIMIT,lot,(NormalizeDouble(Z,4)),3,Ask-(SL+15)*Point,Ask+(TP-15)*Point,"My order #"+i,400,0,Green);                
         }
     }  

Сделайте так, например.


Успехов.

ЗЫ Перечитал алгоритм из первого поста - этот тоже не будет работать, как Вы хотите. Можно так :

int SetOrd( double Z=1.4000, int Delta= 15, int MGCK=400)
{
int o_cnt=0, res=0;
double dPnt = Delta*Point;
    if(MathAbs(Ask-Z)>dPnt)// попадание вне области +-Delta пунктов он цели     
        return(0);
    
    int n_ord = OrdersTotal();
    if(n_ord==0) 
    {
        res = OrderSend(Symbol(),OP_BUYLIMIT,lot,(NormalizeDouble(Z,4)),3,Ask-(SL+Delta)*Point,Ask+(TP-Delta)*Point,"My order #"+i,MGCK,0,Green); 
        if(res!=-1) o_cnt++;
        else
        {
         // Errors ?????
        }
    }
    else
    {
        o_cnt=0;
        for (int i= n_ord-1;i>=0;i--)
        {
             if(!OrderSelect(i,SELECT_BY_POS, MODE_TRADES)) break;
             if(OrderMagicNumber()==MGCK) o_cnt++;
        }
        if(o_cnt==0)
        {
            res = OrderSend(Symbol(),OP_BUYLIMIT,lot,(NormalizeDouble(Z,4)),3,Ask-(SL+Delta)*Point,Ask+(TP-Delta)*Point,"My order #"+i,MGCK,0,Green);    
            if(res!=-1) o_cnt++;
            else
            {
             // Errors ?????
            }
        }            
         
    } 
    return(o_cnt);
}

Успехов.

 

Как движется дело?

На каком ты этапе?

 
SeIv >>:

Как движется дело?

На каком ты этапе?

Попробовал ваш вариант и несколько других - не сработало. Для отдельного блока код подходит, а мне нужно что бы каждый работал самостоятельно - открывал и закрывал позиции при открытых позициях в других блоках. Сейчас пробую вариант с OrderOpenPrice( ) , но пока тоже безрезультатно.