Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 191

 
yan720:

Спасибо за ответ. Сам удивился, что такой вопрос вообще возник. Хотя, может быть я не так понял то, что увидел и что стало причиной вопроса.

Я сейчас смотрю чужой код, чтобы увидеть, какими способами (отличными от моих и, возможно, более эффективными) реализуются те или иные алгоритмы. Сейчас я смотрю на пресловутый советник Ilan 1.6 (приложен). Видно, что его собирали из разных кусков, а потом пересобирали. Но там в строке 337 объявлена пользовательская функция трейлингстопа (хотя флаг его использования и обнулён принудительно в самом начале). Вызывается эта функция в строке 52.

Мой вопрос возник из-за того, что вышеупомянутый трейлингстоп модифицирует открытые ордера (а их может быть несколько) по стоплоссу, сохраняя их первоначальный тейкпрофит, НО задавая этим ордерам в качестве цены открытия (второго параметра функции OrderModify) одно и то же значение (AveragePrice, которое расчитывается в строках 173 и 178).

Или при модификации открытого ордера этот параметр (цена открытия) просто не берётся сервером во внимание и цену можно ставить любой?

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

PS Я б на вашем месте не стал искать в этом коде "эффективные алгоритмы" - там похоже чел писал код, не особо-то и понимая, что он там делает...

 
Нате
 Alert("Исполнение программы");
    double p[100];
    int i =0;
    int n = OrdersTotal ();
    int t =0;
    
    for (i=0; i<=n+1; i++)
    {
    
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
     {
     
      p[i+1] = OrderProfit();      // р - це прибуток ордера
     
     } 
    }
    for (i=0; i<=n+1; i++)
    {
    if (p[i+1]>0)                  // якщо ордер прибутковий, то його 
    {
      Alert("Є прибуток ордер ",i+1);
      OrderSelect(i+1,SELECT_BY_POS,MODE_TRADES); 
      Alert("Маємо помилку ",GetLastError());
      Alert("Вибрали ордер ",i+1);
      double ld_Price;
      if (OrderType() == 0) ld_Price = NormalizeDouble (Bid, Digits);
      else ld_Price = NormalizeDouble (Ask, Digits);
      OrderClose (OrderTicket(), OrderLots(), ld_Price, 2);  // треба зачинити 
      Alert("Маємо помилку ",GetLastError());
      Alert("Закрили ордер ",i+1); 
       if ( OrderType()==OP_BUY)                              //  в залежності від того, якого типу ордер ми зачинили
       { 
        Alert("Ордер типу бай");
        OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid-25*Point,Ask+25*Point);   // змінюється порядок відкривання наступних ордерів
        Alert("Відкрили ордер типу селл");
        Sleep(10000);
        OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point);
        Alert("Відкрили ордер типу бай");
        }else
      {
        OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point);
        Alert("Відкрили ордер типу бай");
        Sleep(10000);
        OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid-25*Point,Ask+25*Point);    
        Alert("Відкрили ордер типу селл");
      }
    } 
   } 
    Alert("Последняя ошыбка ",GetLastError()); 
//----
   return(0);
  }

найдіть же ту "глупость" будьте ласкаві, змилуйтесь над людиною, змученою паскалем.

 
artmedia70:
При модификации рыночной позиции, цена должна быть задана и равняться цене открытия позиции: OrderOpenPrise()

Тогда эта функция, по-Вашему, не будет работать? Испытания не проводил, но она, как мне кажется, является частью работающего кода (этот Илан явно пересобирали из чего-то худо-бедно отлаженного). Или всё же корявый код?

void TrailingAlls(int pType, int stop, double AvgPrice) {
   int profit;
   double stoptrade;
   double stopcal;
   if (stop != 0) {
      for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
         if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) {
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
            if (OrderSymbol() == Symbol() || OrderMagicNumber() == MagicNumber) {
               if (OrderType() == OP_BUY) {
                  profit = NormalizeDouble((Bid - AvgPrice) / Point, 0);
                  if (profit < pType) continue;
                  stoptrade = OrderStopLoss();
                  stopcal = Bid - stop * Point;
                  if (stoptrade == 0.0 || (stoptrade != 0.0 && stopcal > stoptrade)) OrderModify(OrderTicket(), AvgPrice, stopcal, OrderTakeProfit(), 0, Aqua);
               }
               if (OrderType() == OP_SELL) {
                  profit = NormalizeDouble((AvgPrice - Ask) / Point, 0);
                  if (profit < pType) continue;
                  stoptrade = OrderStopLoss();
                  stopcal = Ask + stop * Point;
                  if (stoptrade == 0.0 || (stoptrade != 0.0 && stopcal < stoptrade)) OrderModify(OrderTicket(), AvgPrice, stopcal, OrderTakeProfit(), 0, Red);
               }
            }
            Sleep(1000);
         }
      }
   }
}
 
Здравствуйте,необходимо написать советник по стратегии 3 свечи.Торговля ведется на ренко графиках которые очищены от шумов рынка.При трех последовательных барах в одном направление открываем ордер на покупку или на продажу,стоп лосс ставим на вершине преведущего бара,после закрытия свечи переносим стоп лосс на преведущий бар
 
artmedia70:

PS Я б на вашем месте не стал искать в этом коде "эффективные алгоритмы" - там похоже чел писал код, не особо-то и понимая, что он там делает...

Да, код весьма специфичный с большим количеством избыточности и не только. Но меня интересует не столько алгоритмы, как таковые, сколько подход к реализации заложенной идеи. Смотрю на общий рисунок, что ли. Что вынесено в отдельные функции, как реализован тот же трейлинг в отличие от моего и т.п. Я самоучка и мне это просто полезно :)
 
artmedia70:
В нужном месте - это в каком?


стоит например ордер в месте 1200 пунктов уже.. а цена например опускалась опускалась а звезды выстроились так что в этом месте нужно поставить ордер.. а ордер уже стоит и чтобы не опускать баланс ниже нужного чтоб не ставить 2 ордера по единичке допустим
 
yan720:

Тогда эта функция, по-Вашему, не будет работать? Испытания не проводил, но она, как мне кажется, является частью работающего кода (этот Илан явно пересобирали из чего-то худо-бедно отлаженного). Или всё же корявый код?

Ну... код не для реала. По-крайней мере.

 
Уважаемые господа программисты, если у кого-то есть пару свободных минут отзовитесь пожалуйста. суть вопроса такая. Хочу переделать стандартного советника MACD simple, но в программировании я полный 0.
А поменять хочу чтобы советник советник работал не с одним ордером а с сеткой, стопом и маджиком.
Вот переменные которые хотел добавить:
Stoploss = располагается на одном уровне для всей сетки, например равен по евре/дол = 200пп. и располагается на уровне 1,3450 для всех ордеров в сетке
МахOpenOrder = максимальное кол-во ордеров в сетке, например если=3, то в сетке макс. к-во ордеров будет 3
Dist = расстояние между ордерами (отложки)

Lommultiplicator = коэффициент увеличения лота следующего ордера сетки.

Magic= магический номер

Выход из сделки осуществляется как в исходном коде, т.е. все ордера сетки закрываются в момент закрытия 1-го ордера.

Вот собственно и все
Если кто отзовется буду весьма благодарен!!!
Может у кого есть уже т.к. воплощенный в жизнь готовый советник, тоже подойдет.
 
sannin:

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

Как-то так:

//+----------------------------------------------------------------------------+
bool ExistOrdersByPrice(string sy, int op, int mn, double pp) {
   int i, k=OrdersTotal()-1;
   for (i=k; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()!=op)          continue;
         if (MathAbs(OrderOpenPrice()-pp)<0.5*Point) return(true);
         }
      else Print("FUNC ExistOrdersByPrice() : ошибка выбора ордера "+GetLastError());
      }
   return(false);
}
//+----------------------------------------------------------------------------+

Чтобы проверить, есть ли на текущем символе ордер BuyStop по цене 1.35000 с магиком Magic, вызываем функцию:

//+----------------------------------------------------------------------------+
   if (!ExistOrdersByPrice(Symbol(), OP_BUYSTOP, Magic, 1.35000)) {
      // тут код, если нет такого ордера
      }
   else {
      // тут код, если есть такой ордер
      }
//+----------------------------------------------------------------------------+
 
atztek:

Если речь о документации то выделите слово в MetEditor и нажмите F1. Либо в инете, Например:
https://docs.mql4.com/ru/customind/SetLevelStyle

Конечно спасибо, но если лень прочитать вопрос, то смысл тогда вообще отвечать ? В двух функциях которые есть для работы с уровнями в индикаторе я могу изменить их значение, толщину, цвет и стиль. А вот к описанию доступа у меня нет. Повторюсь знает ли кто ответ. Может сталкивался ?

Прилепил картинку чтобы было видно что мне надо.

Причина обращения: