Помогите написать код. - страница 3

 
закрываются они они пока примитивным тралом, а там уже как получится, вместе или раздельно. Р2 - это расчетная цена.
 

думал уже может както при помощи этой функции

Файлы:
 
rlx:

Т.е. если есть переменная какую позицию надо открыть, Например та же p2

И при этом есть переменная по которой известно которую позицию Бай надо закрыть (та же p2)

Тогда каждый блок (БАй, СеллСтоп, селл) можно идентифицировать по этой переменной p2

Это для случая торговли Вверх



Ну оно то так и происходит. я беру переменную P2 выставляю отложку Бай, далее я использую уже саму цену открытия и отступ от нее на 200 PriceOpenLastPos("0", OP_BUY, Magic)-Point*200

вот в этом то и проблема, при появление новой позиции бай Р2 и PriceOpenLastPos("0", OP_BUY, Magic)-Point*200 уже будут другие соответственно сбивается условная линия "Замка" и перестает отслеживаться тот первый бай.

 

Судя по этому условию

Есть расчетная цена p2.

if( p2 != PriceOpenLastPos("0", OP_BUY, Magic)) ЕСли нет сработавщих байев по этой цене
{
if (p2 != PriceOpenLastClosePos("0", OP_BUY, Magic)) Если нет закрытых БАйев по этой цене.
{

Т.е. нужно чтобы при расчетной цене р2 и наличии сигнала не плодилось много ордеров.

А новый ордер поялялся только если цена р2 будет новая. И при этом будет сигнал на покупку.

Тогда здесь может быть проблема. Через неделю например будет снова сигнал на покупку и при чем цена р2 будет среди закрытых ордеров.

Если использовать вместо этого. Переменную с последней ценой р2.

double lastp2 = 0; /// Объявлена в начале кода

старт()

{

...................

if ((lastp2!=p2) &&(signal))

{

Создаем отложенник БайСтоп

Если отложенник создался, то lastp2 = p2;

}

...................

}

Как такой вариант ?? Тогда будет намного легче следить за позициями.

 

ах да это интерестно. немного упростить код можно.

что касается локов тоя в идеале должно быть так

 
//===========================  Открытие позиций  ===================================+  
if (Lastp2 != p2)
{
//+=================================================================================+
  // Проверка условий для совершения сделки бай
if( Сигнал )
       {
      SL=0;TP=0;
      if(StopLoss>0)   SL=Bid - StopLoss*  Point;       // StopLoss   (цена)
      if(TakeProfit>0) TP=Bid + TakeProfit*Point;      // TakeProfit (цена)
      lots=LotsCounting();    
   ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,p2,3,SL,TP,"Покупаем- хи-хи ",Magic,0,Magenta);
   Lastp2 = p2;
   if(ticket < 0) 
   {
            Print("Ошибка открытия ордера BUY #", GetLastError()); 
            Sleep(10000); 
            prevtime = Time[1]; 
            return (0);
         } 
       }
     }
//======================== конец блока открытия позиций ============================+
Я наверное както не так добавил? Потому-что не работает, позиции плодятся.
 

Lastp2 нужно добавть только если ticket > 0

if(ticket > 0) Lastp2 = p2;

int Lastp2 = 0; определена перед функциями инит() и старт() ??

 

А нет, разобрался, все отлично работает даже лучше чем по старой схеме.

Но давайте вернемся к основной проблемке

 
int magic = 123; ///Магическое число эксперта.
int magicLimit = 10000; ///Магическое число эксперта.
int init()
  {
   return(0);
  }
int    _ORDER_LOK[][6];
/*
OP_BUY  0       Покупка
OP_SELL 1       Продажа
OP_BUYLIMIT     2       Отложенный ордер BUY LIMIT
OP_SELLLIMIT    3       Отложенный ордер SELL LIMIT
OP_BUYSTOP      4       Отложенный ордер BUY STOP
OP_SELLSTOP     5       Отложенный ордер SELL STOP
*/
double _ORDER_BUY_PRICE[];
bool _ORDER_SELL_MODIFED[];
int start()
  {
//----
   int iMagic;
   string sym = Symbol();
   int magMin = magic * magicLimit;//// Номера от 12300000
   int magMax = (magic+1) * magicLimit - 1;//// до 12399999
   int n, k;
   int ticket;
   //ArrayInitialize(_ORDER_BUY, -1);
   double lots = 0.01, SL, TP;
   double price;
   
   
   n = ArrayRange(_ORDER_LOK, 0);
   if (n > 0) ArrayInitialize(_ORDER_LOK, 0);
   
   n = OrdersTotal();
   for (int y = 0; y < n; y++)                  
     {
      if (OrderSelect(y, SELECT_BY_POS, MODE_TRADES))                
        {
         if (OrderSymbol()!=sym) continue;
         iMagic = OrderMagicNumber();
         if (iMagic < magMin) continue;
         if (iMagic > magMax) continue;
         ticket = OrderTicket();
         int type = OrderType();
         k = iMagic - magMin;
         int s = ArrayRange(_ORDER_LOK, 0);
         k++;
         if (s < k)
           {
            ArrayResize(_ORDER_LOK, k);
            ArrayResize(_ORDER_BUY_PRICE, k);
            ArrayResize(_ORDER_SELL_MODIFED, k);
           }
         k--;
         if (type==OP_BUYSTOP)
           {
            _ORDER_LOK[k][OP_BUYSTOP] = ticket;
            continue;
           }
         if (type==OP_BUY)
           {
            _ORDER_LOK[k][OP_BUY] = ticket;
            _ORDER_BUY_PRICE[k] = OrderOpenPrice();
            continue;
           }
         if (type==OP_SELL) 
           {
            _ORDER_LOK[k][OP_SELL] = ticket;
            if (!_ORDER_SELL_MODIFED[k])
              {
               price = OrderOpenPrice();
               if (NormalizeDouble((price - Ask) / Point, 0) > 50)
                 {
                  if (OrderModify(ticket, price,NormalizeDouble(_ORDER_BUY_PRICE[k]-Point*200, Digits),OrderTakeProfit(),0,Blue))
                    {_ORDER_SELL_MODIFED[k] = true;} 
                 }
              }
            continue;
           }
         if (type==OP_SELLSTOP) 
           {
            _ORDER_LOK[k][OP_SELLSTOP] = ticket;
           }
        }
     }
   n = ArrayRange(_ORDER_LOK, 0);
   for (k=0; k<n; k++)
     {
      iMagic = magMin + k;
      if(_ORDER_LOK[k][OP_BUY]==0)///BUY
        {
         if(_ORDER_LOK[k][OP_SELLSTOP]!=0)///SELLSTOP
           {
            if (OrderDelete(_ORDER_LOK[k][OP_SELLSTOP])) _ORDER_LOK[k][OP_SELLSTOP] = 0;
           }
         if(_ORDER_LOK[k][OP_SELL]!=0)////SELL
           {
            if (OrderClose(_ORDER_LOK[k][OP_SELL], lots, Ask, 3, CLR_NONE)) _ORDER_LOK[k][OP_SELL] = 0;
           }
        }
      else
        {
         _ORDER_LOK[k][OP_BUYSTOP] = 0;
         if(_ORDER_LOK[k][OP_SELL]!=0) continue;////SellStop srabotal
         if(_ORDER_LOK[k][OP_SELL]==0) _ORDER_SELL_MODIFED[k] = false;
         if(_ORDER_LOK[k][OP_SELLSTOP]==0)///SellStopa NET
           {
            SL=0;TP=0;
            if(StopLoss>0)   SL= NormalizeDouble(Ask + StopLoss*  Point, Digits);       // StopLoss   (цена)
            if(TakeProfit>0) TP= NormalizeDouble(Ask - TakeProfit*Point, Digits);      // TakeProfit (цена)
            lots=LotsCounting();
            price = NormalizeDouble(_ORDER_BUY_PRICE[k]-Point*200, Digits);
            if (price <= 0.0) continue;
            ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,price,3,SL,TP,"SELLSTOP ",iMagic,0,Magenta);
            if (ticket > 0) _ORDER_LOK[k][OP_SELLSTOP] = ticket;
           }
        }
     }
     
     
   ////// ФУНКЦИЯ СОЗДАНИЯ БАЙСТОП ПО СИГНАЛУ В КОНЦЕ
   ////// ФУНКЦИЯ СОЗДАНИЯ БАЙСТОП ПО СИГНАЛУ В КОНЦЕ
     if ((signal) &&(Lastp2!=p2))
       {
         n = ArrayRange(_ORDER_LOK, 0);
         
         iMagic = -1;
         for (k = 0; k < n; k++)                  
           {
            if ((_ORDER_LOK[k][OP_BUYSTOP]==0)&&(_ORDER_LOK[k][OP_BUY]==0)&&(_ORDER_LOK[k][OP_SELL]==0)&&(_ORDER_LOK[k][OP_SELLSTOP]==0)) iMagic = k;
           }
         if (iMagic==-1)
           {
            n++;
            if (n <= magicLimit)
              {
               ArrayResize(_ORDER_LOK, n);
               ArrayResize(_ORDER_BUY_PRICE, n);
               ArrayResize(_ORDER_SELL_MODIFED, n);
               iMagic = n - 1;
              }
           }
         if (iMagic!=-1)
           {
            iMagic = magMin + iMagic;
            SL=0;TP=0;
            if(StopLoss>0)   SL=Bid - StopLoss*  Point;       // StopLoss   (цена)
            if(TakeProfit>0) TP=Bid + TakeProfit*Point;      // TakeProfit (цена)
            lots=LotsCounting();
            ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,NormalizeDouble(Ask, Digits),3,SL,TP,"BUY ",iMagic,0,Magenta);
            if (ticket > 0) Lastp2 = p2;
            if (ticket < 0) 
              {
               Print("Error open BUY order");
              }
           }
       }

   ////// ФУНКЦИЯ СОЗДАНИЯ БАЙСТОП ПО СИГНАЛУ В КОНЦЕ
   ////// ФУНКЦИЯ СОЗДАНИЯ БАЙСТОП ПО СИГНАЛУ В КОНЦЕ

 

ГЫ. это для случая открытия вверх