помогите устранить ошибку в скрипте (общий СЛ, ТП)

У Вас есть идея, под которую нужен торговый робот? А, быть может, требуется создание нового индикатора или адаптация старого к МТ5? Бесплатно советники и индикаторы под Ваше техническое задание!

помогите устранить ошибку в скрипте (общий СЛ, ТП)

Сообщение YURIY007 » 05 фев 2017, 08:35

Здравствуйте, уважаемые специалисты MQL4 , написал я скрипт точнее изменил и доработал под себя.
Суть скрипта это выставлять общий стоплосс или тейкпрофит по всей позиции когда очень много ордеров, он накидывается на график и там есть мерцающая линия, куда ее потянешь там можно выставить стоп или тп, когда ее перетянул в нужное место нажимаешь удалить выскакивает окошко в нем два варианта удалить или отмена, если нажать удалить скрипт выставит тп или сл на уровне линии если отмена просто удалится и ничего не изменится. при перетаскивании линии в верху скрипт считает какой будет профит и риск от депозита на месте расположения линии, в низу считает лотность и расстояние в пунктах от цены до линии. это я рассказал как он работает. а теперь о проблеме.
Этот скрипт все валютные пары считает все правильно, а золото и нефть не хочет правильно считать профит который отображается в верхней части экрана я уже перепробовал всякие варианты (сам немного пишу) но я уже не знаю что делать где зарыта собака, почему валюты считает правильно а золото нет, но уровни выставляет правильно.
Код: выделить все
//+------------------------------------------------------------------+
//|                                                  Общ  СЛ_ТП .mq4 |
//|                                                       ZVARICHYRA |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "ZVARICHYRA"
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
extern color clr = Red; // Цвет сообщения на экране (Баланс и Профит)
extern int font = 12; // Размер шрифта сообщения на экране (Баланс и Профит)
double STL = 0;
int iii = 0;
double lots = 0;
string prof_risk,res, res1, pp, res2;
int i=0;
//+------------------------------------------------------------------+
void OnDeinit(const int reason){Comment (" ");ObjectDelete ("10");ObjectDelete ("Label");ObjectDelete("nm");}
//---------------------------------
void OnStart()
  {
 
if (IsConnected()) {
     if (ObjectFind("Label") == (-1)) {linebye();}
     if (ObjectFind("10") == (-1)) {ObjectCreate ("10",OBJ_TEXT,0,Time[WindowBarsPerChart( )/3] , WindowPriceMax(0)  );
     ObjectSetText("10", DoubleToStr (Close[4],4), font, "Arial", clr);}
   
     while (ObjectFind("Label")!=(-1) )     {
     STL =NormalizeDouble( ObjectGet("Label", 1),Digits);     text();
    Comment("\n"+"Значение линии: " +DoubleToStr(STL,Digits)
   /*  +"\n" + "Суммарный лот: " +DoubleToStr(lots(),2)
      + "\n"+ "Прибыль/убыток на уровне линии: " + res1
     + " и размер баланса: " + res +"\n"
     + "Для прекращения работы скрипта удалите мерцающую линию "*/ );
     
     if (iii == 5) {Sleep (30); ObjectSet( "Label", 6, Blue); WindowRedraw( );} else Sleep (30);   
     if (iii == 10) {Sleep (30); ObjectSet( "Label", 6, White); WindowRedraw( );} else Sleep (30);     
     if (iii == 10) iii = 0;     iii = iii+1;
     }
     if (lots() != 0) {
     if (MessageBox (" Установить уровень закрытия ордеров по цене мигающей линии??? ","Скрипт интересуется:",1)==1) startset();
     }
}
else MessageBox ("Нет соединения с сервером!!!","  Скрипт сообщает:",0x00000000);
   
}
//+------------------------------------------------------------------+
int linebye() {// Рисуем линию (которая мигает)
ObjectDelete( "Label");
ObjectCreate( "Label", OBJ_HLINE, 0, 0, (Bid-Point*(MarketInfo(Symbol(), MODE_STOPLEVEL))) );
ObjectSet( "Label", 6, White); ObjectSet( "Label", 8, 2); WindowRedraw( ) ;
   return(0);  }
//+------------------------------------------------------------------+
string text() {
   
   if (funkprice()  != 0){
   res = DoubleToStr ((AccountBalance( ) - (((STL - funkprice())/Point)*MarketInfo(Symbol(), MODE_TICKVALUE)*lots()*(-1))),0);
   res1 = DoubleToStr ((    (((STL - funkprice())/Point)*MarketInfo(Symbol(), MODE_TICKVALUE)*lots())),2);
   res2 = DoubleToStr ((100*(((STL - funkprice())/Point)*MarketInfo(Symbol(), MODE_TICKVALUE)*lots()))/AccountBalance(),2);
   pp = DoubleToStr ( (STL-MarketInfo(Symbol(),MODE_BID))/Point,0);  }
   else {res = " Суммарный лот = 0! "; res1 = ""; res2 = "";}
   
   if (((((STL - funkprice())/Point)*MarketInfo(Symbol(), MODE_TICKVALUE)*lots()))>0) { clr = Blue; prof_risk="Профит";}  else   {clr = Red;prof_risk="Риск"; }
 
   
   ObjectSetText("10"," "+prof_risk+" "+res1+" "+AccountCurrency( )+" ("+res2+"% от Depo ) " , font, "Arial", clr);
   SetLabel("nm","ПУНКТОВ "+pp +", ЛОТ: " + DoubleToStr(lots(),2)+ "  ",Red,10,10,3,9);
   WindowRedraw( ) ;
return((string) 0); }
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
double  funkprice()  {

   double price=0;
   if (lots()!=0)
   {
    if (lots()>0)  price = MarketInfo(Symbol(),MODE_BID) - ((symbolprofit()/(MarketInfo(Symbol(), MODE_TICKVALUE)*lots()))*Point);
    if (lots()<0)  price = MarketInfo(Symbol(),MODE_ASK) - ((symbolprofit()/(MarketInfo(Symbol(), MODE_TICKVALUE)*lots()))*Point);
   }
   return (price);   }
   
//*******************************************
int startset()  { int kol=0; int kolOK=0;   i=0; double ilots=0;
   for (i=0; i<OrdersTotal(); i++)   
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol()!=Symbol()) continue;
      if (OrderType()==OP_BUY)
      {
       ilots=ilots+OrderLots();
       kol=kol+1;
      }
      if (OrderType()==OP_SELL)
      {
       ilots=ilots-OrderLots();
       kol=kol+1;
      }
   }
//-----
 Alert ("!!!  Пожалуйста дождитель окончания работы скрипта!");
 int resi = 0;
 for (i=0; i<OrdersTotal(); i++)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol()!=Symbol()) continue;
       
         if (STL>Ask)
         { if (OrderType()==OP_BUY) {if (STL == OrderTakeProfit()) resi=resi+1; else { if (OrderModify(OrderTicket(),0,OrderStopLoss(),STL,0,CLR_NONE)) resi = resi+1;}    }
           if (OrderType()==OP_SELL){if (STL == OrderStopLoss()) resi=resi+1; else { if (  OrderModify(OrderTicket(),0,(STL+(Ask-Bid)),OrderTakeProfit(),0,CLR_NONE)) resi = resi+1;}     } }
         if (STL<Bid)
         { if (OrderType()==OP_BUY) {if (STL == OrderStopLoss()) resi=resi+1; else { if (  OrderModify(OrderTicket(),0,(STL-(Ask-Bid)),OrderTakeProfit(),0,CLR_NONE)) resi = resi+1;} }
           if (OrderType()==OP_SELL){if (STL == OrderTakeProfit()) resi=resi+1; else { if (OrderModify(OrderTicket(),0,OrderStopLoss(),STL,0,CLR_NONE)) resi = resi+1;}    } }
         
   }
 Alert ("***************************************************");
 if (kol==resi) Alert ("Все ордера успешно изменены! ОК!"); else Alert ("!!! Внимание!!! Не удалось изменить - " +((string)(kol - resi))+ " ордера из "+(string)kol+" имеющихся");
 Alert ("************ информация от скрипта ************");
 return(0);
 } 
double lots()
{
double sumlots = 0;
for (i=0; i<OrdersTotal(); i++)   
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol()!=Symbol()) continue;
      if (OrderType()==OP_BUY)
      {
       sumlots=sumlots+OrderLots();
      }
      if (OrderType()==OP_SELL)
      {
       sumlots=sumlots-OrderLots();
      }
   }
return(sumlots);
}   

//**************************

double symbolprofit() // profit по ордерам текущего инструмента (без свопов и комиссий)
{
double sprofit = 0;
for (i=0; i<OrdersTotal(); i++)   
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol()!=Symbol()) continue;
      sprofit = sprofit + OrderProfit( );
   }
return(sprofit);

}   
 
//+------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//-------------
Аватар пользователя
YURIY007
 
Сообщений: 563
Зарегистрирован: 02 фев 2017, 17:47
Средств на руках: 2.30 Доллар
Откуда: Украина
Группа: Базовая
Благодарил (а): 271 раз.
Поблагодарили: 222 раз.
ПРОДАМ СТРОЧКУ В ПОДПИСИ — 25 WMZ на месяц. (для рекламы любого ресурса с вашей реф ссылкой).
мой журналквазиарбитражрегистрация на форум
1000$ в управление, без вложений (пишите в ЛС)

помогите устранить ошибку в скрипте (общий СЛ, ТП)

Сообщение YURIY007 » 05 фев 2017, 08:42

вот так выглядит скрипт в работе, и еще извиняюсь что выложил в таком виде код скрипта , пока не знаю как тут делать вложение.
Аватар пользователя
YURIY007
 
Сообщений: 563
Зарегистрирован: 02 фев 2017, 17:47
Средств на руках: 2.30 Доллар
Откуда: Украина
Группа: Базовая
Благодарил (а): 271 раз.
Поблагодарили: 222 раз.
ПРОДАМ СТРОЧКУ В ПОДПИСИ — 25 WMZ на месяц. (для рекламы любого ресурса с вашей реф ссылкой).
мой журналквазиарбитражрегистрация на форум
1000$ в управление, без вложений (пишите в ЛС)

помогите устранить ошибку в скрипте (общий СЛ, ТП)

Сообщение Kalkin » 05 фев 2017, 16:46

Все дело в способе вычисления прибыли. Для форексных пар у Вас примерно таким образом делается:
Код: выделить все
((((STL - funkprice())/Point)*MarketInfo(Symbol(), MODE_TICKVALUE)*lots())

Но для золота и нефти способ вычисления прибыли CFD. Это можно увидеть в спецификации контракта, а средствами MQL4 получить при помощи функции MarketInfo(Symbol(), MODE_PROFITCALCMODE). Если функция возвращает значение 0, то считаем как Форекс, а если 1 - то как CFD, и формула для расчета будет несколько другой. Попробуйте вот так:
Код: выделить все
((((STL - funkprice())/Point)*MarketInfo(Symbol(), MODE_TICKVALUE)/MarketInfo(Symbol(), MODE_TICKSIZE)/MarketInfo(Symbol(), MODE_LOTSIZE)*lots())


Соответственно, во всех местах скрипта, где необходимы подобного рода расчеты, должны быть проверки способа вычисления прибыли и применяться разные формулы.
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive


Вернуться в Торговые советники на заказ

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 277

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron