[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 65

 

,谢谢你的提示,这里有一个功能,如果有人需要,可以在图表的 左下角显示评论。

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);
}

 
你能告诉我如何在一个脚本中重新打开一个文件:打开文件--查看--关闭文件,当我试图重新打开它时,它说 "文件结束"...
 
你好,请问是否有人遇到过这样的问题:在货币图表窗口,有时图表本身会消失。 然后它说刷新,一切都恢复了。在这个时候,有时专家顾问开始不正确地工作(无条件地打开交易)。今天甚至以最大手数开了一笔交易。我已经注意到了,并以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);
//-------------------------------------------------------

使用在全局水平上声明的数组字符串Mass_Name_Message[10]。这是一个用于存储对象名称的数组。你可以根据你的需要改变其大小。前缀变量存储了专家的名字,以使他们能够识别自己的对象,从而正确处理图形对象。它也是全局声明的,具有字符串类型。你也许能想出办法...

拖车中的土耳其

附加的文件:
 

面对我的功能的一个小问题。

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);
}

它修剪了一条长信息,例如,如果你试图对 "检查你的EA设置,要打开设置窗口按F7 "这一行进行评论。

它只是留下了这个。"检查你的EA设置,打开设置窗口",然后就被切断了,尽管文字甚至还没到窗口的一半。

你能告诉我是否有办法取消这一限制吗?

 

不,标签中的最大行长=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);
}

它修剪了一条长信息,例如,如果你试图对 "检查你的EA设置,要打开设置窗口按F7 "这一行进行评论。

它只是留下了这个。"检查您的EA设置,打开设置窗口",然后就被切断了,尽管文字甚至还没到窗口的一半。

你能告诉我是否有办法取消这一限制吗?

试试我的功能。它就在这一页上你的帖子上面。将一个字符串分成几个字符串,使每个字符串的长度不超过64个字符。我的函数输出这些分割线,一个在另一个之上。然后,当下一条信息显示时,它对上面的旧信息进行灰度处理,并以你调用我的函数时设置的颜色显示新信息。
 
我下载了历史记录,无意中发现我在2012.01.16至2012.03.20的USDJPY上有一个洞。当我试图重新下载时,终端回答说我有整个历史。
我怎样才能填补这一空白?
我怎样才能在没有任何漏洞的情况下上传历史?
还有,是否有办法检查历史上是否有漏洞?
 
artmedia70:
试试我的功能。它就在这一页上你的帖子上面。将一个字符串分成几个字符串,使每个字符串的长度不超过64个字符。我的函数输出这些分割线,一个在另一个之上。然后,当下一条信息显示时,它对上面的旧信息进行灰度处理,并以你调用我的函数时设置的颜色显示新信息。
谢谢,但这对我来说有点复杂,你的函数一次输出4条信息,而我需要一条。原来一行中不超过64个字符?