[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 65

 

Roll, спасибо за наводку, вот сделал функцию вывода комментария в левый нижний угол графика, если кому надо:

void mycomment(color c,string mytext)
{
string name="mycomment";
if(ObjectFind(name)<0) ObjectCreate(name,OBJ_LABEL,0,0,0);
ObjectSet("mycomment", OBJPROP_CORNER, 2);
ObjectSet(name,OBJPROP_XDISTANCE,5);
ObjectSet(name,OBJPROP_YDISTANCE,7);
ObjectSetText(name,mytext,12,"",c);
}

 
Подскажите как в одном скрипте открыть файл повторно: открываю файл - просматриваю до конца - закрываю файл, при попытке повторного открытия пишет "end of file" ...
 
Здравствуйте! Подскажите может кто встечался с такой проблемой:В окне графика валюты иногда пропадает сам график. затем пишет обновление и всё восстанавливается. В это время иногда некорректно начинают работать советники(открытие сделок без наличия условий). Сегодня вообще открылась сделка с максимальным лотом. Хорошо вовремя заметил и прикрыл с убытком 2,5 пункта, но апрельскую прибыль как языком слизало.Подскажите как с этим бороться. Вот код определения лота. Ну вроде никак не должно такое быть.Я подозреваю,что это из за последних двух строчек. Но как?
//========================================================================                                                                              
//определение лота
//========================================================================

double Free =AccountFreeMargin();
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
LOT=NormalizeDouble(AccountFreeMargin()*RISK/100000,2);
if (LOT*One_Lot > Free) // Не хватает даже..
     {                                         // ..на минимальн. лот:(
         Comment("денег нет  " );  
            return(0);                           // ..и выход 
     }
     else Comment("деньга есть  " );
if(LOT<Min_Lot)
 LOT=Min_Lot;
if(LOT>Max_Lot)
 LOT=Max_Lot;
далее открытие ордера по условиям.
 
Lians:

Всем привет!

Подскажите пожалуйста, можно ли вывод текста на график, типа того:

вывести как отдельную функцию, чтобы можно было её вызвать как-то так:

Посмотрите эту ф-цию:

//+----------------------------------------------------------------------------+
void iPrint(bool print, string mess1, string mess2="", string mess3="", string mess4="", 
            int sz=9, color cl1=Aqua, color cl2=Aqua, color cl3=Aqua, color cl4=Aqua) {
   string   NameGrafText, message, nm;
   int      i, y, k, LenStr, shift, Win_Num=-1, num=0;
   color    cl;
   if (mess1=="") {
      Print("Func iPrint: Передана пустая строка, выходим");
      return;
      }
   Win_Num=WindowFind("Win_Inform");
   if (print || Win_Num<0) {
      message=mess1+mess2+mess3+mess4;
      Print(message); 
      return;
      }
   k=ArraySize(Mass_Name_Message)-1;
   if (StringLen(mess1)>0) num++;
   if (StringLen(mess2)>0) num++;
   if (StringLen(mess3)>0) num++;
   if (StringLen(mess4)>0) num++;
   for (i=k; i>=0; i--) {                             
      NameGrafText=Mass_Name_Message[i];           
      if (StringLen(NameGrafText)>0)
      if (ObjectFind(NameGrafText)==Win_Num) {
         if (i+num>k) {
            ObjectDelete(NameGrafText);  
            Mass_Name_Message[i]="";
            }
         else if (i+num<=k) {
            Mass_Name_Message[i+num]=Mass_Name_Message[i];
            y=ObjectGet(NameGrafText, OBJPROP_YDISTANCE);               // координата Y
            ObjectSet  (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // координата Y
            ObjectSet  (NameGrafText, OBJPROP_COLOR, LightSeaGreen);    // цвет
            }
         }
      }
   shift=num;
   int v=GetTickCount();
   for (i=0; i<num; i++) {
      shift--;
      NameGrafText=Prefix+"_Graf_Text_"+i+"_"+sy+"_"+v;
      int app=0;
      while (ObjectFind(NameGrafText)==Win_Num) {
         app++;
         NameGrafText=Prefix+"_Graf_Text_"+i+"_"+sy+"_"+v+"_"+app;
         }
      Mass_Name_Message[num-1-i]=NameGrafText;
      switch (i) {
         case 0: message=mess1; cl=cl1; break;
         case 1: message=mess2; cl=cl2; break;
         case 2: message=mess3; cl=cl3; break;
         case 3: message=mess4; cl=cl4; break;
         default:message=mess1; cl=cl1; break;
         }
      ObjectCreate (NameGrafText, OBJ_LABEL, Win_Num, 0, 0);
      ObjectSetText(NameGrafText, message, sz, "Courier New", cl);
      ObjectSet    (NameGrafText, OBJPROP_COLOR, cl);                   // цвет
      ObjectSet    (NameGrafText, OBJPROP_CORNER,    2);                // угол
      ObjectSet    (NameGrafText, OBJPROP_XDISTANCE, 150);              // координата Х
      ObjectSet    (NameGrafText, OBJPROP_YDISTANCE, 2+(sz+1)*shift);   // координата Y
      WindowRedraw();
      }
   return;
}
//+----------------------------------------------------------------------------+

Ищет на графике окно пустого индикатора Win_Inform и, если есть, выводит в него сообщения. Если нету, выводит принтом.

Пример вызова:

//-------------------------------------------------------
   message1=StringConcatenate("Тик: ",GetTickCount()," ");
   message2=StringConcatenate("Цена Bid: ", DoubleToStr(Bid,dg));
   iPrint(false, message1, message2, "", "", 9, Aqua, DarkOrange);
   b=4; c=7;
   a=b+c;
   message1=StringConcatenate("a=",a," ");
   message2=StringConcatenate("b=",b," ");
   message3=StringConcatenate("c=",c);
   iPrint(false, message1, message2, message3, "", 9, Aqua, LimeGreen, DarkOrange);
   
   message1=StringConcatenate("Время: ", TimeToStr(TimeCurrent())," ");
   message2=StringConcatenate("Тик: ",GetTickCount()," ");
   message3=StringConcatenate("Время бара: ",TimeToStr(Time[0])," ");
   message4=StringConcatenate("Цена Bid: ", DoubleToStr(Bid,dg));
   iPrint(false, message1, message2, message3, message4, 9, Aqua, Aqua, Aqua, DarkOrange);
//-------------------------------------------------------

Использует массив string Mass_Name_Message[10], объявленный на глобальном уровне. Это массив для хранения имён объектов. Размер можете менять под свои нужды. Переменная Prefix хранит имя эксперта, это нужно чтобы эксперт мог идентифицировать свои объекты для правильной работы с графическими объектами. Тоже объявлена на глобальном уровне и имеет тип string. Разберётесь наверное...

Индюк в прицепе

Файлы:
 

Столкнулся с небольшой проблемой с моей функцией:

void mycomment(color c,string mytext)
{
string name="mycomment";
if(ObjectFind(name)<0) ObjectCreate(name,OBJ_LABEL,0,0,0);
ObjectSet("mycomment", OBJPROP_CORNER, 2);
ObjectSet(name,OBJPROP_XDISTANCE,5);
ObjectSet(name,OBJPROP_YDISTANCE,7);
ObjectSetText(name,mytext,12,"",c);
}

Она длинное сообщение обрезает, например, если пытаться прокомментировать строку "Проверьте настройки вашего советника, чтобы открыть окно настроек нажмите F7."

она оставляет только это: "Проверьте настройки вашего советника, чтобы открыть окно настро" и дальше обрезано, хотя текст даже до половины окна не дошел.

Подскажите, пожалуйста, как-нибудь можно убрать это ограничение?

 

Никак, максимальная длинна строки в лейбле = 62 символа.

форматируйте текст в несколько строк (лейблов), или пишите через Comment() - там 255 символов

 
Добрый день!
Сталкнулся с проблемой открытия определенного (заданного пользователем) количества ордеров.
Написал небольшой код который эту проблему должен решить и вроде решает, но бывают моменты
когда открывается произвольное количество ордеров, как правило ближе к концу теста.

Ниже сам код.

extern string Kolichestvo_orderov = "Количество единовременно открытых ордеров";
extern int OrederBuy = 1;
extern int OrederSell = 1;


int OrdS=1,OrdB=1,ticketBuy,ticketSell,lastticketSell=0,lastticketBuy=0;

//========================================================================================================//     
                                  //---- Открытие ордеров SELL ----//
//========================================================================================================//

if(OrdS<=OrederSell)
  { //----- start
 
if(trendDn==true && SthFast>88.2 && SthSlow<38.2)
     {
ticketSell=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,0,magick,0,Blue);OrdS++; //--- Если ордер открыт параметр OrdS увеличиваю 
     }
   } //-----end
          
//========================================================================================================//  
                                   //----Открытие ордеров BUY ----//
//========================================================================================================//  

if(OrdB<=OrederBuy)
  { //-----start

if(trendUp==true && SthFast<11.8 && SthSlow>61.8)
      {
ticketBuy=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,0,magick,0,Red);OrdB++; //--- Если ордер открыт параметр OrdB увеличиваю
      }

  } //------end
  

//------------------------------- Подсчет количества ордеров BUY & SELL ----------------------------------//
   
  if(ticketBuy<=OrdersHistoryTotal()) //------ проверка тикетов тех  ордеров которые уже закрыты
   {
  for(int ordBuy=lastticketBuy;ordBuy<=OrdersHistoryTotal();ordBuy++) //--- перебор новых закрытых ордеров
    {
     if(OrderSelect(ordBuy,SELECT_BY_POS,MODE_HISTORY)==true){if(OrderType()==OP_BUY)OrdB--;lastticketBuy=ticketBuy;} //--- если добавился новый закрытый ордер бай, то параметр OrdB уменьшаю
    }
   }
  
  //-----
    
 if(ticketSell<=OrdersHistoryTotal()) //------ проверка тикетов тех  ордеров которые уже закрыты
  {
 for(int ordSell=lastticketSell;ordSell<=OrdersHistoryTotal();ordSell++) //--- перебор новых закрытых ордеров
     {
     if(OrderSelect(ordSell,SELECT_BY_POS,MODE_HISTORY)==true){if(OrderType()==OP_SELL)OrdS--;lastticketSell=ticketSell;} //--- если добавился новый закрытый ордер селл, то параметр OrdS уменьшаю

Если есть более простые варианты решения проблемы, буду рад комментариям.

 
Lians:

Столкнулся с небольшой проблемой с моей функцией:

void mycomment(color c,string mytext)
{
string name="mycomment";
if(ObjectFind(name)<0) ObjectCreate(name,OBJ_LABEL,0,0,0);
ObjectSet("mycomment", OBJPROP_CORNER, 2);
ObjectSet(name,OBJPROP_XDISTANCE,5);
ObjectSet(name,OBJPROP_YDISTANCE,7);
ObjectSetText(name,mytext,12,"",c);
}

Она длинное сообщение обрезает, например, если пытаться прокомментировать строку "Проверьте настройки вашего советника, чтобы открыть окно настроек нажмите F7."

она оставляет только это: "Проверьте настройки вашего советника, чтобы открыть окно настро" и дальше обрезано, хотя текст даже до половины окна не дошел.

Подскажите, пожалуйста, как-нибудь можно убрать это ограничение?

Попробуйте мою функцию. Она выше вашего сообщения на этой странице. Разбивайте строку на несколько так, чтобы каждая была не более 64 символов. Моя ф-ция эти разбитые строки выводит одну над другой. Далее, при выводе следующего сообщения, она старые окрашивает серым и поднимает выше, а новое сообщение опять выводит в заданном при вызове ф-ции цвете.
 
Закачал историю, случайно выяснил что в USDJPY с 2012.01.16 по 2012.03.20 у меня дыра. На попытку повторной закачки терминал ответил что у меня вся история.
Как закачать эту дыру?
Как закачать историю без дыр?
И можно ли как-то проверять есть ли дыры в истории?
 
artmedia70:
Попробуйте мою функцию. Она выше вашего сообщения на этой странице. Разбивайте строку на несколько так, чтобы каждая была не более 64 символов. Моя ф-ция эти разбитые строки выводит одну над другой. Далее, при выводе следующего сообщения, она старые окрашивает серым и поднимает выше, а новое сообщение опять выводит в заданном при вызове ф-ции цвете.
Спасибо, но для меня сложновато, и Ваша функция выводит сразу 4 сообщения, а мне надо одно. Получается не более 64-х символов в одной строке?