Функция Расчёта Цены Безубытка - страница 5

 
SNAIKE:

Вот может кому пригодится, функция расчитывает уровень безубытка отдельно для Buy - Sell а так же общий уровень безубытка

Берем возвращаяемое значение

 

по моему это лишнее
double tp =0;
 
SNAIKE:

Вот может кому пригодится, функция расчитывает уровень безубытка отдельно для Buy - Sell а так же общий уровень безубытка

Берем возвращаяемое значение

 

Вызывает сомнение эта строка: оператор &&. Вроде бы здесь оператор || как то больше подходит.


if(OrderMagicNumber() != MagicNumber && OrderSymbol()!=Symbol() ) continue;
 
khorosh:

Вызывает сомнение эта строка: оператор &&.


if(OrderMagicNumber() != MagicNumber && OrderSymbol()!=Symbol() ) continue;
Лучше в две строки разнести.
 

Вот 2 функции для добавления в советники. Показываются 3 линии: безубыток, плановое взятие заданной суммы профита и линия уровня 100%, ниже которой позиции терминал не поставит. Вначале использовался способ по цене, умноженной на лот, но потом было переделано на подсчёты от профита, вроде так точнее.

//==============================================================================================================//

//|   ------------- NN02__ Ф. показывает линии безубытка и заданной прибыли для множества ордеров ------------

//==============================================================================================================//

void NN02_Indikacia_Linii(int Blok_Koda,double ZN) //ф. нахожд. ценовой линии заданн. профита, можно исп. для постановки на неё локового лимитника

  {

   double Lot,Alg_Sum_Lot,S_Lot_B,S_Lot_S,Marg,Popr;

   static double Sum_Z;

   int OT;//ф. хорошо работает! отображает 3 линии

   double Linua_0P,TV,PRS_poprav,Abs_SuLt,Sum_Prof;

   if(IsOptimization())//

      return;

   if(Blok_Koda==1)

     {

      Sum_Z=ZN;//в этом блоке есть только быстрое обновление значения из ф. подсчёта взятия плановой прибыли

      return;//применяется для показа линии взятия планового профита (ещё одна линия над безубытком)

     }//при указании другой цифры блока кода выполнится основной алгоритм (можно указать 2 нуля в аргументах)

   for(int n=OrdersTotal(); n>=0; n--)//можно не на каждом тике выполнять, чтобы проц VPS не перегружать на пятизнаке

     {

      if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES))

        {

         if(OrderSymbol()!=Symbol())

            continue;//с других графиков не учитывается

         OT=OrderType();

         if(OT>1)

            continue;//отложенники откидываем

         //OOP=OrderOpenPrice();//сейчас используется алгоритм без ценолота (чисто по профитам)

         Lot=OrderLots();

         if(OT==0)

           {

            ///////Sum_CxL+=OOP*Lot;//ценолот - берём бай с плюсом, селл с минусом

            S_Lot_B+=Lot;//суммирование лотов - бай (для обоих алгоритмов)

           }

         if(OT==1)

           {

            ////////Sum_CxL-=OOP*Lot;    //сейчас используется алгоритм без ценолота (по профитам)

            S_Lot_S+=Lot;

           }

         Sum_Prof+=(OrderProfit()+OrderSwap());//общий профит для бай и селл

        }

     }//кц - данные к расчёту подготовлены

   Alg_Sum_Lot=ND(S_Lot_B-S_Lot_S,2);//бай с плюсом, селл с минусом;

   Abs_SuLt=Alg_Sum_Lot;//со знаком плюс или минус

   Abs_SuLt=MathAbs(Abs_SuLt);//чтобы со знаком плюс было - абс. величина

   if(Alg_Sum_Lot==0)//чтобы на ноль не делить

     {

      ObjectDelete("L_Null");

      ObjectDelete("L_Plus");

      return;

     }

////Linua_0P=Sum_CxL/Alg_Sum_Lot-Point*2;//расчёт по ценолоту нулевого безубытка - пока без свопа и убытков;

   TV=MarketInfo(Symbol(),MODE_TICKVALUE);

   if(TV==0)

      return;//чтобы не было деления на ноль

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

   if(Alg_Sum_Lot>0)//алгоритм по профиту, без ценолота; более точно работает на низких лотах;

     {

      Linua_0P=Bid-(Sum_Prof*Point/(TV*Abs_SuLt));//линия нулевого профита

     }

   if(Alg_Sum_Lot<0 && Abs_SuLt>0 && Sum_Prof!=0)

     {

      Linua_0P=Ask+(Sum_Prof*Point/(TV*Abs_SuLt));//линия нулевого профита

     }

   NN03_Risovanie_Linii(ND(Linua_0P),"L_Null",clrFuchsia);//отображение линии нулевой прибыли

   PRS_poprav=ND(Sum_Z*Point/(TV*Abs_SuLt)+Point*3,4);//расст. между линиями в единицах вертикальной шкалы графика

   if(S_Lot_B>S_Lot_S)//когда перевес ордеров бай

     {

      NN03_Risovanie_Linii(ND(Linua_0P+PRS_poprav),"L_Plus",clrMediumOrchid);//знак плюс  --- линия прибыли

     }

   if(S_Lot_B<S_Lot_S)//когда перевес ордеров селл

     {

      NN03_Risovanie_Linii(Linua_0P-PRS_poprav,"L_Plus",clrMediumOrchid);// это линия получения заданного профита

     }

   Marg=AccountFreeMargin()-Sum_Prof;

   Popr=ND(Marg*Point/(TV*Abs_SuLt+Point*3),4);//линия невозможности постановок

   if(Alg_Sum_Lot>0)

      Popr=Linua_0P-Popr;

   else

      Linua_0P+Popr;

   NN03_Risovanie_Linii(Popr,"Marg",clrRosyBrown);

   return;

  }

//==============================================================================================================//

//|                     ----------------- NN03__ рисование линий -------------------

//==============================================================================================================//

void NN03_Risovanie_Linii(double Price=0.0,string NameLine="MyLine",color ColorLine=DarkOliveGreen)

  {

   int indWnd=0;

   if(ObjectFind(NameLine)==-1)

      ObjectCreate(NameLine,OBJ_HLINE,indWnd,0,Price);

   if(Price==0.0)

      ObjectDelete(NameLine);

   else

     {

      ObjectSet(NameLine,OBJPROP_PRICE1,Price);

      ObjectSet(NameLine,OBJPROP_COLOR,ColorLine);

     }

   return;

  }
//###############################################################################################
double ND(double Znachenie,int H_Zn=10) //при отказе от ввода второго параметра возьмётся значение Digits
  {
   if(H_Zn==10)
      H_Zn=Digits;
   return(NormalizeDouble(Znachenie,H_Zn));
  }//и пятизнак учитывается
 

ппц портянка....

пишите легко читаемые проги, проще ошибки искать....

double bLt,sLt, bPr,sPr,sumPr;

int i;

bPr=sPr=bLt=sLt=sumPr=0.0;

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

         {

            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol())

            {

               if(OrderType()==OP_BUY)

               {

                 bLt+=OrderLots();

                 bPr+=(OrderProfit()+OrderCommission()+OrderSwap());

               }

               if(OrderType()==OP_SELL)

               {

                 sLt+=OrderLots();

                 sPr+=(OrderProfit()+OrderCommission()+OrderSwap());

               }

            }

         }

sumPr=bPr+sPr;

тут комментарии излишни, правда?

т.к. все понятно без них

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