Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 727

 
Vitaly Muzichenko:

Ну так и есть, но значок не выделяется

void SetArrow(string nm,string tooltxt="",datetime t=0,double p=0,color col=clrRed,long type=0) {
if(ObjectFind(0,nm)!=0) {
    ObjectCreate(0,nm,type==0?OBJ_ARROW_BUY:OBJ_ARROW_SELL,0,0,0);
    ObjectSetInteger(0,nm,OBJPROP_COLOR,col);
    ObjectSetInteger(0,nm,OBJPROP_SELECTED,true);
    ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(0,nm,OBJPROP_HIDDEN,false);
    ObjectSetString(0,nm,OBJPROP_TOOLTIP,tooltxt);
   }
    ObjectSetDouble(0,nm,OBJPROP_PRICE,p);
    ObjectSetInteger(0,nm,OBJPROP_TIME,t);
}

Всё выделяется:

Выделение 

Файлы:
OBJ_ARROW.mq5  22 kb
 
Vladimir Karputov:

Всё выделяется:

 

Блин, Я правил одну функцию, а проверял другую, всё работает. Спасибо! Пойду спать)
 

Заметил странную особенность, если прописать так, то линии не выделяет при создании

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);

А вот если наоборот, то проблем с выделением нет:

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);

Почему-то от замены слагаемых, сумма меняется?

 
Vitaly Muzichenko:

Заметил странную особенность, если прописать так, то линии не выделяет при создании

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);

А вот если наоборот, то проблем с выделением нет:

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);

Почему-то от замены слагаемых, сумма меняется?

Видимо, когда 

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);

последняя команда, чарт обновляется 

 
Vitaly Muzichenko:

Заметил странную особенность, если прописать так, то линии не выделяет при создании

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);

А вот если наоборот, то проблем с выделением нет:

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);

Почему-то от замены слагаемых, сумма меняется?

Изначально наверное при создании объекта ему устанавливается свойство по умолчанию как невыделяемое.

Далее вы его выделяете (но объект не выделяемый), соответственно, ничего не выделяется

Затем вы ему задаёте свойство возможности выделения. Но "поздно пить боржоми" ...
 

Ну так вот полный код:

void SetVLine(long chart_ID=0,string nm="nm",datetime tm=0,int wd=1,int st=0,color cl=clrRed,
                                             string tooltxt="",bool sel=false,bool back=false) {
if(ObjectFind(chart_ID,nm)<0) {
    ObjectCreate(chart_ID,nm,OBJ_VLINE,0,tm,0);
    ObjectSetInteger(chart_ID,nm,OBJPROP_TIME,tm);
    ObjectSetInteger(chart_ID,nm,OBJPROP_BACK,back);
    ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);
  // ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
    ObjectSetString(chart_ID,nm,OBJPROP_TOOLTIP,tooltxt);
    ObjectSetInteger(chart_ID,nm,OBJPROP_COLOR,cl);
    ObjectSetInteger(chart_ID,nm,OBJPROP_WIDTH,wd);
    ObjectSetInteger(chart_ID,nm,OBJPROP_STYLE,st);
   }
}

Да, перепроверил на всех типах объектов, и нужно первым ставить "SELECTABLE", а потом уже "SELECTED

Спасибо за участие и помощь в решении! 

 
В МетаТрэйдере5 есть возможность с генерировать советник из 3 блоков. 1блок выдает сигналы от индикатора или от нескольких индикаторов. 2 блок трейлинги. 3 блок риски.

Подскажите пожалуйста  1. можно ли в 1 блок добавить пользовательские индикаторы? Если да , то как это сделать?

                                       2. можно ли подправить код так чтобы сделки открывались в обе стороны( сейчас например если открылась сделка на покупку, сделка на продажу не открывается пока не закроется сделка на покупку)
 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL4 MT4 MetaTrader 4".
 

Здравствуйте. Как то писал советник на MetaTraider 4. Вернее учился писать. Многое не умею и не знаю еще. И решил перенести его на MetaTraider 5 где немного оказалось все по другому. Вообщем брал другой советник. Разбирал его. Копировал код для открытия ставок. Вообщем ошибок вроде нету но работает не так как должно быть. Помогите перенести правильно. 

 MetaTraider 4:

int err = 0;            
double Lot = 0.01;       // Лот
double CoofLot = 0;
double Ballance = AccountBalance();
double loss = 100;    
bool nap = true;       //true  - 1
                       //false - 0
int start()
  {  
    if(OrdersTotal()==0)                                
    {
       if(Ballance != AccountBalance())                
       {
        if(AccountBalance() < Ballance )                
        {
            CoofLot++;
            Lot = pow(2, CoofLot) * 0.01;
            if(nap == true)                            
               {
                nap = false;
               }
             else
               {
                nap = true;
               }
         }
         if(AccountBalance() > Ballance)                
           {
             Lot = 0.01;
             CoofLot = 0;
           }
       }
    Ballance = AccountBalance();
    
    int order;
    if(nap == true)                                      
      {
       order = OrderSend(Symbol(),OP_BUY,Lot,Ask,1*Point,Ask-loss*Point,Ask+loss*Point);   // Вверх
      }                  
    else
      {
       order = OrderSend(Symbol(),OP_SELL,Lot,Bid,1*Point,Bid+loss*Point,Bid-loss*Point);    // Вниз
      }
  
       if(order<0)                                
         {
           if (GetLastError()==134)
             {
               err=1;
               Print("NOT ENOGUGHT MONEY!!");
             }
           return (-1);
         }
       }
   return(0);
  }


И вот кое как перенес на MetaTraider 5:

double Lot = 0.01;      
double CoofLot = 0;

double Ballance = ACCOUNT_BALANCE;
double loss = 100;    
bool nap = true;       //true  - 1
                       //false - 0



void OnTick()
{
   MqlTick latest_price;       // Будет использоваться для текущих котировок
   MqlTradeRequest mrequest;   // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;  
   if(OrdersTotal()==0)                                
      {
      if(!SymbolInfoTick(_Symbol,latest_price))
         {
            Alert("Ошибка получения последних котировок - ошибка:",GetLastError(),"!!");
            return;
         }
        
      if(Ballance != ACCOUNT_BALANCE)                
       {
        if(ACCOUNT_BALANCE < Ballance )                
        {
            CoofLot++;
            Lot = pow(2, CoofLot) * 0.01;
            if(nap == true)                            
               {
                nap = false;
               }
             else
               {
                nap = true;
               }
         }
         if(ACCOUNT_BALANCE > Ballance)                
           {
             Lot = 0.01;
             CoofLot = 0;
           }
       }
    Ballance = ACCOUNT_BALANCE;
    int order;
    if(nap == true)                                      
      {
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - 100*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + 100*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = Lot;                                                // количество лотов для торговли
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_FOK;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=100;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер

         order = OrderSend(mrequest,mresult);
      }                  
    else
      {
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + 100*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - 100*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = Lot;                                                // количество лотов для торговли
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.type_filling = ORDER_FILLING_FOK;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=100;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер

         order = OrderSend(mrequest,mresult);  
      }
      }
   return;
  }
 
DenZell:

Здравствуйте. Как то писал советник на MetaTraider 4. Вернее учился писать. Многое не умею и не знаю еще. И решил перенести его на MetaTraider 5 где немного оказалось все по другому. Вообщем брал другой советник. Разбирал его. Копировал код для открытия ставок. Вообщем ошибок вроде нету но работает не так как должно быть. Помогите перенести правильно. 


Код будет такой (но при этом будьте внимательны - здесь идёт проверка на общее количество позиций на торговом счёте (PositionsTotal):

   if(PositionsTotal()==0)

то есть нет проверки сколько именно позиций по данному символу и данному Magic (к слову сказать, Magic вообще не задан))

//+------------------------------------------------------------------+
//|                                                       TestEA.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//---
double         Lot            = 0.01;
double         CoofLot        = 1.0;
double         loss           = 100.0;
bool           nap            = true;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   CoofLot  = 1.0;
   loss     = 100.0;
   nap      = true;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static double         Balance=0.0;
   if(Balance==0.0)
      Balance=AccountInfoDouble(ACCOUNT_BALANCE);

   if(PositionsTotal()==0)
     {
      MqlTick latest_price;                        // Будет использоваться для текущих котировок
      if(!SymbolInfoTick(_Symbol,latest_price))
        {
         Alert("Ошибка получения последних котировок - ошибка:",GetLastError(),"!!");
         return;
        }

      if(Balance!=AccountInfoDouble(ACCOUNT_BALANCE))
        {
         if(AccountInfoDouble(ACCOUNT_BALANCE)<Balance)
           {
            CoofLot++;
            Lot=pow(2,CoofLot)*0.01;
            if(nap==true)
              {
               nap=false;
              }
            else
              {
               nap=true;
              }
           }
         if(AccountInfoDouble(ACCOUNT_BALANCE)>Balance)
           {
            Lot=0.01;
            CoofLot=1.0;
           }
        }
      Balance=AccountInfoDouble(ACCOUNT_BALANCE);

      MqlTradeRequest mrequest;   // Будет использоваться для отсылки торговых запросов
      MqlTradeResult mresult;
      ZeroMemory(mrequest);
      ZeroMemory(mresult);

      bool order=false;
      if(nap==true)
        {
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.bid - 100*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid + 100*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = Lot;                                                // количество лотов для торговли
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_FOK;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=100;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер

         order=OrderSend(mrequest,mresult);
        }
      else
        {
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.ask + 100*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask - 100*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = Lot;                                                // количество лотов для торговли
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.type_filling = ORDER_FILLING_FOK;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=100;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер

         order=OrderSend(mrequest,mresult);
        }
     }
   return;
  }
//+------------------------------------------------------------------+

Также результат операции OrderSend имеет тип bool.
 

Для хранения баланса я применил статическую переменную

   static double         Balance=0.0;
   if(Balance==0.0)
      Balance=AccountInfoDouble(ACCOUNT_BALANCE);

- то есть переменная "Balance" при последующих заходах в OnTick() не будет пересоздаваться заново, а она будет помнить своё значение с предыдущего тика.

Файлы:
TestEA.mq5  10 kb