Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 36

 

Здравствуйте уважаемые !

помогите поправить код что бы надписи над барами были по центру бара над хай-ем а не сбоку

 

#property strict 
#property indicator_chart_window 

input int      TextSize = 8; //размер шрифта 
input color    TextColor = clrYellow; //цвет текста 
input int      TextAngle = 90; //угол поворота текста 
input int      MaxBar = 100;  //количество баров, начиная с 0, для которых вычисляется размер свечей 

int OnInit() 
   return(INIT_SUCCEEDED); 

int OnCalculate(const int rates_total, 
                const int prev_calculated, 
                const datetime &time[], 
                const double &open[], 
                const double &high[], 
                const double &low[], 
                const double &close[], 
                const long &tick_volume[], 
                const long &volume[], 
                const int &spread[]) 
   int i; 
   for ( i = 0; i < MaxBar; i++ )   { 
      if ( ObjectFind ("candlesize"+ IntegerToString(i)) >=0 )   { 
             ObjectDelete("candlesize"+ IntegerToString(i)); 
      } 
      ObjectCreate ("candlesize"+ IntegerToString(i),  
                    OBJ_TEXT,  
                    0,  
                    time[i],  
                    high[i]+StepPer()*Point); 
      ObjectSet (  "candlesize"+IntegerToString(i),  
                    OBJPROP_ANGLE,  
                    TextAngle 
                 ); 
      ObjectSetText ( "candlesize"+IntegerToString(i),  
                      DoubleToStr(NormalizeDouble((high[i]-low[i]+Point)/Point, 0), 0),  
                      TextSize,  
                      NULL,  
                      TextColor 
                     ); 
   } 
   return(rates_total); 

int StepPer () 
     int i = 0; 
     switch (Period()) 
     { 
          case PERIOD_M1: 
          i = 5; 
          break; 
          case PERIOD_M5: 
          i = 15; 
          break; 
          case PERIOD_M15: 
          i = 25; 
          break; 
          case PERIOD_M30: 
          i = 40; 
          break; 
          case PERIOD_H1: 
          i = 60; 
          break; 
          case PERIOD_H4: 
          i = 90; 
          break; 
          case PERIOD_D1: 
          i = 220; 
          break; 
          case PERIOD_W1: 
          i = 500; 
          break; 
          case PERIOD_MN1: 
          i = 2000; 
          break; 
          default:  
          break; 
     } 
     return (i); 
}  

 
ed3sss:

  Доказательство: Print("Предыдущая работа PriceAsk-",PriceAsk); в журнале пусто.

Без подробностей это не доказательство ))) Полный текст инита покажите и объявление переменных.

Кроме того, зачем проверять ВСЕ ордера, от самого начала жизни счёта, если нужны последние??? - а как по другому сделать, если открыто 10 валютных пар? 

С конца перебирать и вовремя выходить из цикла. Причём тут 10 пар? Хоть сто, у вас там есть выбор по символу. 

 
Игорь:

Здравствуйте уважаемые !

помогите поправить код что бы надписи над барами были по центру бара над хай-ем а не сбоку

Учимся использовать кнопку SRC для вставки кода.

И читаем про OBJPROP_ANCHOR.

 
Vitalie Postolache:

Учимся использовать кнопку SRC для вставки кода.

И читаем про OBJPROP_ANCHOR.

все понял спасибо !

 Извините за резкость !

 
Игорь:

все понял спасибо !

 Извините за резкость !

#property strict
#property indicator_chart_window

input int      TextSize = 8; //размер шрифта
input color    TextColor = clrYellow; //цвет текста
input int      TextAngle = 90; //угол поворота текста
input int      MaxBar = 100;  //количество баров, начиная с 0, для которых вычисляется размер свечей

int OnInit()
{
   return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   int i;
   for ( i = 0; i < MaxBar; i++ )   {
      if ( ObjectFind ("candlesize"+ IntegerToString(i)) >=0 )   {
             ObjectDelete("candlesize"+ IntegerToString(i));
      }
      ObjectCreate ("candlesize"+ IntegerToString(i),  
                    OBJ_TEXT,  
                    0,  
                    time[i],  
                    high[i]+StepPer()*Point);
       //--- установим привязку к правому верхнему углу
      ObjectSetInteger(ChartID(),"candlesize"+IntegerToString(i),OBJPROP_ANCHOR,ANCHOR_UPPER);
     ObjectSet (  "candlesize"+IntegerToString(i),  
                    OBJPROP_ANGLE,  
                    TextAngle
                 );
      ObjectSetText ( "candlesize"+IntegerToString(i),  
                      DoubleToStr(NormalizeDouble((high[i]-low[i]+Point)/Point, 0), 0),  
                      TextSize,  
                      NULL,  
                      TextColor
                     );
   }
   return(rates_total);
}

int StepPer ()
{
     int i = 0;
     switch (Period())
     {
          case PERIOD_M1:
          i = 5;
          break;
          case PERIOD_M5:
          i = 15;
          break;
          case PERIOD_M15:
          i = 25;
          break;
          case PERIOD_M30:
          i = 40;
          break;
          case PERIOD_H1:
          i = 60;
          break;
          case PERIOD_H4:
          i = 90;
          break;
          case PERIOD_D1:
          i = 220;
          break;
          case PERIOD_W1:
          i = 500;
          break;
          case PERIOD_MN1:
          i = 2000;
          break;
          default:  
          break;
     }
     return (i);
}  
вот вставил и все равно не по центру и не на том баре !?
 
#property strict
#property indicator_chart_window

input int      TextSize = 8; //размер шрифта
input color    TextColor = clrYellow; //цвет текста
input int      TextAngle = 90; //угол поворота текста
input int      MaxBar = 100;  //количество баров, начиная с 0, для которых вычисляется размер свечей

int OnInit()
{
   return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   int i;
   for ( i = 0; i < MaxBar; i++ )   {
      if ( ObjectFind ("candlesize"+ IntegerToString(i)) >=0 )   {
             ObjectDelete("candlesize"+ IntegerToString(i));
      }
      ObjectCreate ("candlesize"+ IntegerToString(i),  
                    OBJ_TEXT,  
                    0,  
                    time[i],  
                    high[i]+StepPer()*Point);
       //--- установим привязку к правому верхнему углу
      ObjectSetInteger(ChartID(),"candlesize"+IntegerToString(i),OBJPROP_ANCHOR,ANCHOR_UPPER);
     ObjectSet (  "candlesize"+IntegerToString(i),  
                    OBJPROP_ANGLE,  
                    TextAngle
                 );
      ObjectSetText ( "candlesize"+IntegerToString(i),  
                      DoubleToStr(NormalizeDouble((high[i]-low[i]+Point)/Point, 0), 0),  
                      TextSize,  
                      NULL,  
                      TextColor
                     );
   }
   return(rates_total);
}

int StepPer ()
{
     int i = 0;
     switch (Period())
     {
          case PERIOD_M1:
          i = 5;
          break;
          case PERIOD_M5:
          i = 15;
          break;
          case PERIOD_M15:
          i = 25;
          break;
          case PERIOD_M30:
          i = 40;
          break;
          case PERIOD_H1:
          i = 60;
          break;
          case PERIOD_H4:
          i = 90;
          break;
          case PERIOD_D1:
          i = 220;
          break;
          case PERIOD_W1:
          i = 500;
          break;
          case PERIOD_MN1:
          i = 2000;
          break;
          default:  
          break;
     }
     return (i);
}  
Мужики ну помогите бродяге нуна над хайем по центру где косяк !?
 
Игорь:
#property strict
#property indicator_chart_window

input int      TextSize = 8; //размер шрифта
input color    TextColor = clrYellow; //цвет текста
input int      TextAngle = 90; //угол поворота текста
input int      MaxBar = 100;  //количество баров, начиная с 0, для которых вычисляется размер свечей

int OnInit()
{
   return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   int i;
   for ( i = 0; i < MaxBar; i++ )   {
      if ( ObjectFind ("candlesize"+ IntegerToString(i)) >=0 )   {
             ObjectDelete("candlesize"+ IntegerToString(i));
      }
      ObjectCreate ("candlesize"+ IntegerToString(i),  
                    OBJ_TEXT,  
                    0,  
                    time[i],  
                    high[i]+StepPer()*Point);
       //--- установим привязку к правому верхнему углу
      ObjectSetInteger(ChartID(),"candlesize"+IntegerToString(i),OBJPROP_ANCHOR,ANCHOR_UPPER);
     ObjectSet (  "candlesize"+IntegerToString(i),  
                    OBJPROP_ANGLE,  
                    TextAngle
                 );
      ObjectSetText ( "candlesize"+IntegerToString(i),  
                      DoubleToStr(NormalizeDouble((high[i]-low[i]+Point)/Point, 0), 0),  
                      TextSize,  
                      NULL,  
                      TextColor
                     );
   }
   return(rates_total);
}

int StepPer ()
{
     int i = 0;
     switch (Period())
     {
          case PERIOD_M1:
          i = 5;
          break;
          case PERIOD_M5:
          i = 15;
          break;
          case PERIOD_M15:
          i = 25;
          break;
          case PERIOD_M30:
          i = 40;
          break;
          case PERIOD_H1:
          i = 60;
          break;
          case PERIOD_H4:
          i = 90;
          break;
          case PERIOD_D1:
          i = 220;
          break;
          case PERIOD_W1:
          i = 500;
          break;
          case PERIOD_MN1:
          i = 2000;
          break;
          default:  
          break;
     }
     return (i);
}  
Мужики ну помогите бродяге нуна над хайем по центру где косяк !?
по чему то не над баром и сбоку хоть и указал по центру!
 
Игорь:

вот вставил и все равно не по центру и не на том баре !?

Ну так после поворота точка уже не наверху по центру, а слева по центру, вот текст и сместился вправо. 

ObjectSetInteger(ChartID(),"candlesize"+IntegerToString(i),OBJPROP_ANCHOR,ANCHOR_LEFT);
Точка привязки задаётся при повороте 0 градусов, нужно учитывать угол поворота и задавать точку привязки, которая будет внизу, если объект над High, в вашем случае это будет точка слева по центру.
 
Vitalie Postolache:

Ну так после поворота точка уже не наверху по центру, а слева по центру, вот текст и сместился вправо. 

ObjectSetInteger(ChartID(),"candlesize"+IntegerToString(i),OBJPROP_ANCHOR,ANCHOR_LEFT);
Точка привязки задаётся при повороте 0 градусов, нужно учитывать угол поворота и задавать точку привязки, которая будет внизу, если объект над High, в вашем случае это будет точка слева по центру.

Огроменное СПАСИБО !!!!!

Получилось все как хотелось !

Еще раз прошу прощение за непонимание и резкость мою ! 

 
Vitalie Postolache:

Без подробностей это не доказательство ))) Полный текст инита покажите и объявление переменных.

С конца перебирать и вовремя выходить из цикла. Причём тут 10 пар? Хоть сто, у вас там есть выбор по символу. 

      bool s=false;
      double b=AccountBalance();
      i=0;
      for(;i<OrdersTotal();i++)
        {//+----------------------------------------------------------------------------------------+for
         ViborOrdera=OrderSelect(i,SELECT_BY_POS);
         if(OrderSymbol()!=Symbol())continue;
         if(OrderType()>1)continue;
         s=true;
         int Ticket=OrderTicket();
         double Lots=OrderLots();
         double Price;
         if(OrderType()==1)Price=NormalizeDouble(Ask,Digits);else Price=NormalizeDouble(Bid,Digits);
         //+-----------------------------------------------------------------------------------------+
         ViborOrdera=OrderClose(Ticket,Lots,Price,3);
         if(GetLastError()==6){Alert("Нет связи");return(0);}
         if(GetLastError()==132){Alert("Рынок закрыт");return(0);}
         RefreshRates();
         i--;

        }//+---------------------------------------------------------------------------------------+for

Ок, тут тот-же цикл, почему он закрывает ордера?) 

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