Ваши вопросы по языку MQL4

Абдулхаким

Почетный гражданин
Ребята, что вписать в код индикатора чтобы он ставился на график много раз при смене настроек, а непереставлялся только с новыми ???
если речь о графических объектах, то к названиям объектов нужно добавить префикс и вынести его во внешние настройки.
будет ли он взаимодействовать с объектами не своего префикса зависит от кода, если там вообще такое предусмотрено :)
 

dadik

Местный знаток
если речь о графических объектах, то к названиям объектов нужно добавить префикс и вынести его во внешние настройки.
будет ли он взаимодействовать с объектами не своего префикса зависит от кода, если там вообще такое предусмотрено :)
Скажем индюк МА, закинул его на график. Ок. Теперь беру тотже и второй раз ставлю с другой настройкой. А он, убирает показания первого и видна только Машка второго. Ну как пример...
 

Абдулхаким

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

Абдулхаким

Почетный гражданин

mobidik

-----
т.е. надо сделать, чтобы последующие присоединения к графику одного и того же индикатора не удаляли объекты уже стоящих на графике индикаторов ?

Нужно к имени создаваемых объектов добавить префикс - каждый раз, когда на график ставиться та же копия индикатора - нужно менять этот префикс, что бы он не повторялся, да бы не было удаления объектов от уже установленных копий.
 

ZNV

Активный участник
Здравствуйте.
Скажите, как оптимизировать такую запись...?
C-подобный:
 if(Symb=="USDCHF"){   USDCHF_outbid(); }
 if(Symb=="EURUSD"){   EURUSD_outbid(); }
....
....
т.е. нужно как то автоматически запускать функцию, в имя которой нужно вписывать имя символа.
 

AlexeyVik

Программист mql4 mql5
Здравствуйте.
Скажите, как оптимизировать такую запись...?
C-подобный:
 if(Symb=="USDCHF"){   USDCHF_outbid(); }
 if(Symb=="EURUSD"){   EURUSD_outbid(); }
....
....
т.е. нужно как то автоматически запускать функцию, в имя которой нужно вписывать имя символа.
Проще сделать одну функцию и там разбираться с символом.
 

star603

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

vladradon

Программист
Подскажите есть ли индентификатор в маркетинфо которая давала бы информацию возможность торговли?(полный доступ к торгам или только закрытие)?
В справочнике есть варианты возврата этой функции: SymbolInfoInteger(_Symbol,SYMBOL_TRADE_MODE)
 

Вложения

  • STM.png
    STM.png
    13,7 КБ · Просмотры: 14

star603

Новичок форума
В справочнике есть варианты возврата этой функции: SymbolInfoInteger(_Symbol,SYMBOL_TRADE_MODE)
эта функция выдает целые числа поэтому я решил так воплотить:
Код:
void OnTick()
  {
   string SWOP,TORG;
   switch(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_MODE))
     {
      case 1:
         TORG ="Торговля по символу запрещена";
         break;
      case 2:
         TORG ="Разрешены только покупки";
         break;
      case 3:
         TORG ="Разрешены только продажи";
         break;
      case 4:
         TORG ="Разрешены только операции закрытия позиций";
         break;
      case 5:
         TORG ="Нет ограничений на торговые операции";
         break;
     }
   if(MarketInfo(Symbol(),MODE_SWAPLONG)>0)
      SWOP = "Покупки";
   if(MarketInfo(Symbol(),MODE_SWAPSHORT)>0)
      SWOP = "Продажи";
   if(MarketInfo(Symbol(),MODE_SWAPSHORT)<0 && MarketInfo(Symbol(),MODE_SWAPLONG)<0)
      SWOP = "Не торгуем";
   Comment("Cвоп=",SWOP,"\n",
           "Мода торговли=",TORG);
  }
 

star603

Новичок форума
Код:
void OnTick()
  {
   if(OrdersTotal()==0)
     {
      ue(sltp);
      uo(svecha);
      LOT();
      if(svecha[4][1]<0 && svecha[4][2]<0 && svecha[4][3]<0)
         ticketss=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0,"S1 buy",Magic,clrNONE);
      if(svecha[4][1]>0 && svecha[4][2]>0 && svecha[4][3]>0)
         ticketss=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0,"S1 sell",Magic,clrNONE);
     }
  }
  ////////////////////////////////////////////////////////////////////////////////////////////
  double LOT()//Функция по расчету лота
  {
   if(GetLastError()==0)
     {
      switch(_Lot)
        {
         case 0:
            Lot=Lot;
            break;
         case 1:
            Lot=NormalizeDouble(MathCeil(AccountBalance()/100)/100,2);
            break;
         case 2:
            Lot=NormalizeDouble(MathCeil(AccountEquity()/100)/100,2);
            break;       
         case 3:
            Lot=NormalizeDouble((AccountFreeMargin()*RISK)/1000,2);
            break;
        }
     };
   switch(GetLastError())
     {
      case 131:
         Lot=0.01;
         break;
      case 4051://Этот участок почему то на работает когда терминал выдает эту ошибку
         Lot=0.01;
         break;
     }
   return(Lot);
  };
//+------------------------------------------------------------------+

Может что то я не учел?
 

star603

Новичок форума
1.png
Код:
void OnTick()
  {
   for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS) && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         Ticket = OrderTicket();
         Symboly = OrderSymbol();
         int Type = OrderType();
         Lop = OrderLots();
         switch(Type)
           {
            case 0:
               OrderTipe = "Buy";
               break;
            case 1:
               OrderTipe = "Sell";
               break;
           }
        }
      double SL = OrderStopLoss();
      double TP = OrderTakeProfit();
      double OP = OrderProfit();
      Comment("Тикет ордера =",Ticket,"\n",
              "Валютная пара=",Symboly,"\n",
              "Тип ордера=",OrderTipe,"\n",
              "Лот ордера=",Lop,"\n",
              "Стоплос=",SL,"\n",
              "Тейкпрофит=",TP,"\n",
              "Приболь ордера=",OP);
     };
   if(OrdersTotal()==0)
     {
      ue(sltp);
      uo(svecha);
      LOT();
      if(svecha[4][1]<0 && svecha[4][2]<0 && svecha[4][3]<0)
         ticketss=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,sltp[3],"S1 buy",Magic,clrNONE);
      if(svecha[4][1]>0 && svecha[4][2]>0 && svecha[4][3]>0)
         ticketss=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,sltp[1],"S1 sell",Magic,clrNONE);
     }
  }

Что не верно? Скажите пожалуйста.
 

Абдулхаким

Почетный гражданин
Что не верно? Скажите пожалуйста.
На скрине:
прибыль.jpg
это значение и должно меняться, если меняется график цены и открыт 1 или больше ордеров и они не захеджированы.
тестер.jpg
показаны все данные об ордере, открытие и закрытие в том числе

В коде:
C:
for(int y=0; y<= OrdersHistoryTotal()-1; y++){
      if(OrderSelect(y, SELECT_BY_POS){}
}
с этой записью опять что-то не то :)

вот загадка, если просил :)
for(int y=0; y<=OrdersHistoryTotal()-1; y++)
в этой строчке три символа лишние, если их убрать, то ничего не изменится (разве что только расчётов станет меньше)
 

griz

Активный участник
Последнее редактирование:

star603

Новичок форума
На скрине:
Посмотреть вложение 489041
это значение и должно меняться, если меняется график цены и открыт 1 или больше ордеров и они не захеджированы.
Посмотреть вложение 489042
показаны все данные об ордере, открытие и закрытие в том числе

В коде:
C:
for(int y=0; y<= OrdersHistoryTotal()-1; y++){
      if(OrderSelect(y, SELECT_BY_POS){}
}
с этой записью опять что-то не то :)

вот загадка, если просил :)
for(int y=0; y<=OrdersHistoryTotal()-1; y++)
в этой строчке три символа лишние, если их убрать, то ничего не изменится (разве что только расчётов станет меньше)
Переписал вот так:
Код:
if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер

выдает все верно кроме суммы приболи.
 
Верх