SerOv
Сергей

 
Уровень 24

  Торгую в компаниях:


Группа "Стол заказов MQL"

Рейтинг 2090



РЕКОМЕНДУЮ



Скрипт рассчёта уровня безубытка

Здравствуйте Андрей!
Прошу написать скрипт для платформы МТ4 расчитывающий уровень безубытка при открытии локирующей позиции.
Т.З 1-- скрипт при присоединении к графику расчитывает суммарный лот всех открытых позиций на покупку и продажи. Выводит результат в отдельное окно на графике ( удобнее в правом или левом углу: LotBUY=… и LotSELL=...)
2-- скрипт расчитывает необходимый лот для локирующего ордера по формуле LotLok =LotBUY {илиLotSELL } + ( LotBUY {или LotSELL } * 30% ).Выводит также эти результаты в окно LotLokBUY=… и LotLokSELL=…
3-- скрипт при открытии локирующего ордера, объёмом равным расчётным LotLokBUY или LotLokSELL, расчитывает уровень безубытка всех ордеров одного направления + 50 пипс на 5-ти знаке и 5 пунктов на 4-х значных котировках брокера ( от ноля безубытка ) и так же выводит значение этого уровня в окно b\y BUY=… и b\y SELL=…
4---скрипт автоматически переносит все стоплоссы или тейки ордеров одного направления на данный расчётный уровень b\y BUY или
b\y SELL.
5---Нужно чтобы скрипт исправно работал на 4-х и 5-ти значных котировках и в обоих случаях расчитывал лот до значения типа 0.01 ( округляя 3-и и поледующие значения после запятой).

Вроде подробно всё попытался объяснить. Спасибо Андрей за твой труд.
  • +2
  • Просмотров: 7686
  • 7 декабря 2015, 10:18
  • SerOv
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Очередной сов по индюку
Следующая запись в группе  
Алерт к индикатору.
06 декабря 2015
07 декабря 2015

Комментарии (30)

+
0
Я постепенно буду добавлять условия и выкладывать в топике код.
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 7 декабря 2015, 10:59
+
+1
Сделал 2 пункта, смотрите пишите комментарии. В тестере можно прогнать. Есть где код подобный или алгоритм для 3 пункта? А то я уже 3 часа репу чешу как это сделать.




//+------------------------------------------------------------------+
//|                                                     LockInfo.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double BuyLots()
  {
   double lot=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY) lot+=OrderLots();
           }
        }
     }
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double SellLots()
  {
   double lot=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL) lot+=OrderLots();
           }
        }
     }
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Profit()
  {
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL || OrderType()==OP_BUY) pr+=OrderProfit()+OrderSwap()+OrderCommission();
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double SellPrice()
  {
   int count=0;
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL)
              {
               pr+=OrderOpenPrice();
               count++;
              }
           }
        }
     }

   pr=pr/count;
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double BuyPrice()
  {
   int count=0;
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               pr+=OrderOpenPrice();
               count++;
              }
           }
        }
     }

   pr=pr/count;
   return(pr);
  }  
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(IsTesting())
     {
      int r=0;
      if(OrdersTotal()<1)
        {
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         //r=OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         //r=OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         //r=OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         //r=OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         r=OrderSend(Symbol(),OP_SELL,0.65,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
        }
     }

   Comment("\n Sell Lots: ",SellLots(),
           "\n Buy Lots: ",BuyLots(),
           "\n Lock Lot Buy: ",0.3*BuyLots()+BuyLots(),
           "\n Lock Lot Sell: ",0.3*SellLots()+SellLots(),
           "\n Buy Price: ",BuyPrice(),
           "\n Sell Price: ",SellPrice(),
           "\n BU Buy: ",0.3*BuyLots()+BuyLots(),
           "\n BU Sell: ",0.3*SellLots()+SellLots(),
           "\n Profit: ",Profit());
  }
//+------------------------------------------------------------------+

Редактирован: 7 декабря 2015, 12:36
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 7 декабря 2015, 11:26
+
+1
Пусть в рынке имеем

Buy – количество открытых ордеров вверх

BuyPrice[i] — цена открытия i-ого ордера вверх, i=1,…buy

BuyLot[i] — Количество лотов i-ого ордера вверх, i=1,…buy

Sell – количество открытых ордеров вниз

SellPrice[i] — цена открытия i-ого ордера внизх, i=1,… Sell

SellLot[i] — Количество лотов i-ого ордера вниз, i=1,… Sell

Пусть далее

TicValue – значение одного пункта в валюте депозита,

Т.е., TicValue = MarketInfo(Symbol(),MODE_TICKVALUE)

Point – значение одного пункта в валюте котировки,

Т.е., Point = MarketInfo(Symbol(),MODE_POINT)

Пусть далее

TargetPrice – цена, при достижение которой суммарный профит всех открытых

Ордеров в валюте депозита будет равен

TargetProfit

Очевидно, что можно составить такое вот уравнение

СУММА[i=1,…buy]( TargetPrice- BuyPrice[i] )* TicValue* BuyLot[i] / Point

+

СУММА[i=1,… Sell]( SellPrice [i] — TargetPrice)* TicValue* SellLot [i] / Point

= TargetProfit

Отсюда, после очевидных преобразований получим искомую формулу

Для вычислений TargetPrice

TargetPrice =(TargetProfit* Point + СУММА[i=1,…buy]( BuyPrice[i]* TicValue* BuyLot[i]) — СУММА[i=1,… Sell](SellPrice [i]*TicValue* SellLot [i] ) )/

(TicValue*( СУММА[i=1,…buy]( BuyLot[i]) — СУММА[i=1,… Sell]( SellLot [i]) )
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 7 декабря 2015, 13:19
+
+1
Что то я немного сомневаюсь в последней формуле *think* 
Или не разобрался *pardon* 
Редактирован: 7 декабря 2015, 13:50
avatar

  13  Fargo Сообщений: 495

  • 7 декабря 2015, 13:50
+
0
Я как шпаргалку себе скинул. Сейчас тоже буду разбираться. Хоть что то есть подобное.
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 7 декабря 2015, 14:03
+
+2
Меня смущает первое слагаемое в числителе. Зачем его делить на небалансированную позицю еще и умноженную на ticvalue?
Второе то просто среднее арифметическое, если сократить тот же ticvalue.

Вот я как то статейку тиснул mql.opentraders.ru/25225.html
может так проще?
Редактирован: 7 декабря 2015, 14:16
avatar

  13  Fargo Сообщений: 495

  • 7 декабря 2015, 14:14
+
0
Статейка ценная! Благодарствую! *good* 
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 7 декабря 2015, 15:33
+
0
Андрей и Алексей спасибо за проявленный интерес!
По третьему пункту и я сомневался можно ли его реализовать в одном скрипте с расчётами. Ни какого алгоритма и примеров у меня естественно нет = может 3-й и 4-й пункты реализовать через отдельный скрипт — вот и всё что мне пришло в головёшку.
avatar

  24  SerOv Автор Сообщений: 859 - Сергей

  • 7 декабря 2015, 14:45
+
0
Андрей глянул сейчас твой скрин и манёха не понял — расчёт локирующего лота — он должен быть на 30% больше суммарного по позициям = а в окне отображено только эти 30%. Если суммарный лот 0.5*30%=0.15 то в окне должно быть LotsLok=0.5+0.15=0.65 так вроде.
Редактирован: 7 декабря 2015, 16:44
avatar

  24  SerOv Автор Сообщений: 859 - Сергей

  • 7 декабря 2015, 15:07
+
+1
3-й пункт сделал, сейчас тружусь над 4-м.


//+------------------------------------------------------------------+
//|                                                     LockInfo.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

extern int BUPoint = 50;
extern int Prohod  = 150;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double BuyLots()
  {
   double lot=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY) lot+=OrderLots();
           }
        }
     }
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double SellLots()
  {
   double lot=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL) lot+=OrderLots();
           }
        }
     }
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Profit()
  {
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL || OrderType()==OP_BUY) pr+=OrderProfit()+OrderSwap()+OrderCommission();
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double SellPrice()
  {
   int count=1;
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL)
              {
               pr+=OrderOpenPrice();
               count++;
              }
           }
        }
     }

   pr=pr/count;
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double BuyPrice()
  {
   int count=1;
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               pr+=OrderOpenPrice();
               count++;
              }
           }
        }
     }

   pr=pr/count;
   return(pr);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   bool m;
   int bcount=0;
   int scount=0;
   double lots=0;
   double sum=0;
   double sumswap=0;
   double ZeroLevelAll=0;
   double tickvalue=MarketInfo(Symbol(),MODE_TICKVALUE);

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol()!=Symbol()) continue;
      if(OrderType()==OP_BUY)
        {
         bcount++;
         lots+=OrderLots();
         sum+=OrderLots()*OrderOpenPrice();
         sumswap+=OrderSwap()+OrderCommission();
         if(bcount>scount && ZeroLevelAll<OrderOpenPrice())
           {
            if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),ZeroLevelAll-BUPoint*Point,OrderTakeProfit(),0,Yellow);
            return;
           }
/*           
         if(bcount<scount)
           {
            if(OrderTakeProfit()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),ZeroLevelAll,0,Yellow);
           }  
*/
        }

      if(OrderType()==OP_SELL)
        {
         scount++;
         lots-=OrderLots();
         sum-=OrderLots()*OrderOpenPrice();
         sumswap+=OrderSwap()+OrderCommission();
         if(bcount<scount && ZeroLevelAll<OrderOpenPrice())
           {
            if(OrderTakeProfit()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),ZeroLevelAll-BUPoint*Point,0,Yellow);
            return;
           }
/*           
         if(bcount>scount)
           {
            if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),ZeroLevelAll,OrderTakeProfit(),0,Yellow);
           }    
*/
        }
     }

   if(lots>0)
     {
      ZeroLevelAll=sum/lots -(sumswap/(tickvalue *(lots))*Point);   //уровень безубытка для открытых ордеров, перевес Buy
     }

   if(lots<0)
     {
      ZeroLevelAll=sum/lots+(sumswap/(tickvalue *(lots))*Point);    //уровень безубытка для открытых ордеров, перевес Sell
     }

   if(IsTesting())
     {
      int r=0;
      if(OrdersTotal()<1)
        {
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         //r=OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         //r=OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         //r=OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         //r=OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         r=OrderSend(Symbol(),OP_SELL,0.65,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
        }
     }

   Comment("\n Sell Lots: ",SellLots(),
           "\n Buy Lots: ",BuyLots(),
           "\n Sell Pos: ",scount,
           "\n Buy Pos: ",bcount,
           "\n Lock Lot Buy: ",0.3*BuyLots()+BuyLots(),
           "\n Lock Lot Sell: ",0.3*SellLots()+SellLots(),
           "\n BU Buy: ",ZeroLevelAll-BUPoint*Point,
           "\n BU Sell: ",ZeroLevelAll+BUPoint*Point,
           "\n Profit: ",Profit());
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 7 декабря 2015, 16:37
+
0
Как оперативно ты трудишся над моей просьбой --спасибо = такими темпами скоро сведённый результат тестить будем.
avatar

  24  SerOv Автор Сообщений: 859 - Сергей

  • 7 декабря 2015, 16:53
+
+1
Первый успешный вариант. Продолжу завтра.




//+------------------------------------------------------------------+
//|                                                     LockInfo.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

extern int BUPoint = 50;
extern int Prohod  = 150;

double ZeroLevelAll=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double BuyLots()
  {
   double lot=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY) lot+=OrderLots();
           }
        }
     }
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double SellLots()
  {
   double lot=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL) lot+=OrderLots();
           }
        }
     }
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Profit()
  {
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL || OrderType()==OP_BUY) pr+=OrderProfit()+OrderSwap()+OrderCommission();
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double SellPrice()
  {
   int count=0;
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL)
              {
               pr+=OrderOpenPrice(); count++;
              }
           }
        }
     }
   if(count>0)pr=pr/count;
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double BuyPrice()
  {
   int count=0;
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               pr+=OrderOpenPrice(); count++;
              }
           }
        }
     }

   if(count>0)pr=pr/count;
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountBuy()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountSell()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode()
  {
   bool m;
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL)
              {
               if(Ask<ZeroLevelAll-Prohod*Point)
                 {
                  if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),ZeroLevelAll,OrderTakeProfit(),0,Red);
                 }
              }

            if(OrderType()==OP_BUY)
              {
               if(Ask<ZeroLevelAll-Prohod*Point)
                 {
                  if(OrderTakeProfit()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),ZeroLevelAll,0,Red);
                 }
              }
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double lots=BuyLots()-SellLots();
   double sum=BuyPrice()*BuyLots()-SellPrice()*SellLots();

   if(lots>0)
     {
      ZeroLevelAll=sum/lots;   //уровень безубытка для открытых ордеров, перевес Buy
     }

   if(lots<0)
     {
      ZeroLevelAll=sum/lots;    //уровень безубытка для открытых ордеров, перевес Sell
     }

   if(IsTesting())
     {
      int r=0;
      if(OrdersTotal()<1)
        {
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         //r=OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         //r=OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         //r=OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         //r=OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
         r=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),5,0,0,"",0,0,Blue);
         r=OrderSend(Symbol(),OP_SELL,0.65,NormalizeDouble(Bid,Digits),5,0,0,"",0,0,Red);
        }
     }

   Mode();

   Comment("\n Sell Lots: ",SellLots(),
           "\n Buy Lots: ",BuyLots(),
           "\n Sell Pos: ",CountSell(),
           "\n Buy Pos: ",CountBuy(),
           "\n Lock Lot Buy: ",0.3*BuyLots()+BuyLots(),
           "\n Lock Lot Sell: ",0.3*SellLots()+SellLots(),
           "\n BU Buy: ",ZeroLevelAll,
           "\n BU Sell: ",ZeroLevelAll,
           "\n Profit: ",Profit());
  }
//+------------------------------------------------------------------+


Редактирован: 8 декабря 2015, 17:46
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 7 декабря 2015, 17:23
+
+1
В обратную сторону баи не берет вообще а сел цепляет только один, чтобы я ни пытался делать. Закоментаренное не работает.



//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode()
  {
   bool m;
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
/*            if(CountBuy()<CountSell())
              {
               if(OrderType()==OP_SELL)
                 {
                  if(Bid>ZeroLevelAll+Prohod*Point)
                    {
                     if(OrderTakeProfit()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),ZeroLevelAll,0,Red);
                    }
                 }   
                 
               if(OrderType()==OP_BUY)
                 {
                  if(Bid>ZeroLevelAll+Prohod*Point)
                    {
                     if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),ZeroLevelAll,OrderTakeProfit(),0,Red);
                    }
                 }                                          
              }  
*/              
            if(CountBuy()>CountSell())
              {
               if(OrderType()==OP_SELL)
                 {
                  if(Ask<ZeroLevelAll-Prohod*Point)
                    {
                     if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),ZeroLevelAll,OrderTakeProfit(),0,Red);
                    }
                 }

               if(OrderType()==OP_BUY)
                 {
                  if(Ask<ZeroLevelAll-Prohod*Point)
                    {
                     if(OrderTakeProfit()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),ZeroLevelAll,0,Red);
                    }
                 }
              }                                        
           }
        }
     }
  }
//+------------------------------------------------------------------+
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 9 декабря 2015, 12:26
+
+1
1. А где нормализация ZeroLevelAll?
2. if(CountBuy()<CountSell()) будет правильно работать только если все ордера имеют одинаковую лотность.
3. Причина тут:
if(OrderType()==OP_SELL)
                 {
                  if(Ask<ZeroLevelAll-Prohod*Point)

и
if(OrderType()==OP_BUY)
                 {
                  if(Ask<ZeroLevelAll-Prohod*Point)
avatar

  13  Fargo Сообщений: 495

  • 9 декабря 2015, 13:50
+
0
Получается — не реализуемая задача так? Но я в тебя верю Андрей — не торопись не горит же может что и придумаеш *good* 
avatar

  24  SerOv Автор Сообщений: 859 - Сергей

  • 9 декабря 2015, 13:50
+
+1
Удивительно, растащил код по разным функциям и все заработало! www.opentraders.ru/downloads/969/

avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 9 декабря 2015, 13:52
+
+1
3. Причина тут:

Да глаз замыливается, когда долго сидишь. Благодарю. Остальное еще смотреть буду.
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 9 декабря 2015, 14:04
+
+1
3. Причина тут:


Сначала разделил все по разным функциям а потом ради интереса все собрал в одно. Почти тоже самое все а заработало!


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode()
  {
   bool m;
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(CountBuy()<CountSell())
              {
               if(OrderType()==OP_BUY)
                 {
                  if(Bid>ZeroLevelAll+Prohod*Point)
                    {
                     if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),ZeroLevelAll,OrderTakeProfit(),0,Red);
                    }
                 }

               if(OrderType()==OP_SELL)
                 {
                  if(Bid>ZeroLevelAll+Prohod*Point)
                    {
                     if(OrderTakeProfit()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),ZeroLevelAll,0,Red);
                    }
                 }
              }

            if(CountBuy()>CountSell())
              {
               if(OrderType()==OP_SELL)
                 {
                  if(Ask<ZeroLevelAll-Prohod*Point)
                    {
                     if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),ZeroLevelAll,OrderTakeProfit(),0,Red);
                    }
                 }

               if(OrderType()==OP_BUY)
                 {
                  if(Ask<ZeroLevelAll-Prohod*Point)
                    {
                     if(OrderTakeProfit()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),ZeroLevelAll,0,Red);
                    }
                 }
              }
           }
        }
     }
  }
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 9 декабря 2015, 14:11
+
+1
Скачал и посмотрел последний вариант, в главной функции

  if(CountBuy()<CountSell()) ModeBuyLock();
  if(CountBuy()>CountSell()) ModeSellLock();


В случае 1 ордера Sell объемом 0,1 и 5-ти ордеров Buy каждый объемом по 0,01 работать будет неправильно
Нужно применить BuyLots() и SellLots()
avatar

  13  Fargo Сообщений: 495

  • 9 декабря 2015, 14:13
+
+1
Да это вернее будет. *yes* 
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 9 декабря 2015, 14:19
+
0
Алексей спасибо за помощь и участие = Вы с Андреем большие молодцы ТАК ДЕРЖАТЬ !!!*lalala* *good* *bravo* 
avatar

  24  SerOv Автор Сообщений: 859 - Сергей

  • 9 декабря 2015, 14:24
+
0
Андрей — выше ссылка на загрузку там уже окончательный вариант или ещё чего то шаманить надо?
avatar

  24  SerOv Автор Сообщений: 859 - Сергей

  • 10 декабря 2015, 19:10
+
0
Смотрите, если устраивает, то все.
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 10 декабря 2015, 19:40
+
0
Спасибо Андрей всё понял — правда когда вплотную тестированием займусь не знаю в тестере ведь его не прогнать (на реале в полевых условиях придётса).
avatar

  24  SerOv Автор Сообщений: 859 - Сергей

  • 10 декабря 2015, 19:50
+
0
Почему не прогнать, я специально делал открытие позиций чтобы можно было отладить и протестировать хотя бы приблизительно.
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 10 декабря 2015, 20:46
+
0
Да канеш прогоню в демо.
avatar

  24  SerOv Автор Сообщений: 859 - Сергей

  • 11 декабря 2015, 07:40
+
0
Андрей небольшая просьба по данному советнику — работает на ура = а просьба такая: — перенести информационное окно в правый угол и увеличить шрифт т.к плоховато вижу и в очках. И ещё убрать лишние знаки в значениях оставить нормальный пятизнак а то почемуто в значениях их очень много появляется. Спасибо!
P.S это в последней строке — профит — их много появляется при пересчёте --НУ и бог с ними НЕ заморачивайся.
Редактирован: 22 декабря 2015, 19:15
avatar

  24  SerOv Автор Сообщений: 859 - Сергей

  • 22 декабря 2015, 18:42
+
0
Сейчас так: www.opentraders.ru/downloads/969/

avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 23 декабря 2015, 02:32
+
0
Спасибо!!! ты Андрей как всегда оперативен. А чего то не удаляется окно при удалении советника = как то не айс это!
Редактирован: 23 декабря 2015, 08:38
avatar

  24  SerOv Автор Сообщений: 859 - Сергей

  • 23 декабря 2015, 07:47
+
0
Здравствуйте! Искал скрипт, который бы делал расчет безубытка для селл и бай ордеров на одном инструменте для отдельного закрытия, например только селл ордеров, а бай — оставлять. Много форумов перелистал и зашел на это обсуждение и решил что это то, что нужно, но после установки увидел, что безубыток для селл и бай показывает на одном уровне и я так понял, что это общий уровень показывает для обеих групп ордеров. Могли бы вы подсказать, может что в настройках советника изменить, но там только две функии? Заранее большое спасибо!
avatar

  0  Bogrom Сообщений: 1

  • 21 января 2020, 21:45

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари