どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 1089

 

もう一つの疑問は、余分なゼロをカットする方法です。

double a = 0.20000;

を0.2倍する
小数点以下の桁数は常に異なる値を使用します。
 
Money_Maker:

もう一つの疑問は、余分なゼロをカットする方法です。

を0.2にする。
小数点以下の桁数は常に異なる値を使用します。

小数点以下は8桁まであり、必要な分だけ修正します。

// Переводит в строку курс
string KursS(double Ku) {
int k, i;
string S; // 8 дробных цифр для составного курса открытия позиции в MT5
S=DoubleToString(NormalizeDouble(Ku,8),8); // Уберем концевые нули
i=StringLen(S)-1;
if (StringSubstr(S,i,1)!="0") return(S); // Их нет
for (k=i-1;k>0;k--) if (StringSubstr(S,k,1)!="0") {S=StringSubstr(S,0,k+1); break;}
i=StringLen(S)-1; // Уберем концевую точку
if (StringSubstr(S,i,1)==".") S=StringSubstr(S,0,i);
return (S);
} // KursS
 
Money_Maker ありがとうございます)時間短縮できないのが残念です(
横線 名で時間保存が可能
 
boing9267:    こんばんは、スクリプトを実行するとログにuninit reason 0 ...というエラーが表示されるのですが、何が問題なのか教えてください。

このように再構築することで、すべてがうまくいく

void OnStart()
{
   ObjectCreate(ChartID(),"HLine",OBJ_HLINE,0,0,iHigh(NULL,PERIOD_W1,0));
   ObjectSetInteger(ChartID(),"HLine",OBJPROP_COLOR, Yellow); // Желтый виднее 
   ObjectSetInteger(ChartID(),"HLine",OBJPROP_STYLE,0);   // стиль отображения
   ObjectSetInteger(ChartID(),"HLine",OBJPROP_WIDTH,1);   // толщина линии 
   ObjectSetInteger(ChartID(),"HLine",OBJPROP_BACK,true); // на передний план 

   ObjectCreate(ChartID(),"LLine",OBJ_HLINE,0,0,iLow(NULL,PERIOD_W1,0));
   ObjectSetInteger(ChartID(),"LLine",OBJPROP_COLOR,Blue); 
   ObjectSetInteger(ChartID(),"LLine",OBJPROP_STYLE,0); 
   ObjectSetInteger(ChartID(),"LLine",OBJPROP_WIDTH,1); 
   ObjectSetInteger(ChartID(),"LLine",OBJPROP_BACK,true); 
}
 
Vlad143:    ここには小数点以下8桁までの数字がありますが、お好きなように修正してください。
// Переводит в строку курс    Вот так короче!!!  Строк меньше и в каждой строке прозрачнее
string Kurs(double Ku)
{
  string S="0";   int n=8;     // Количество знаков дробной части
  while(S[StringLen(S)-1]=='0'  && n>=0)
  {
    S=DoubleToString(Ku,n); // n дробных цифр
    n--;
  }
  return (S);
} // Kurs
 
LRA:


ソースコードでは短く、実行では長く。高速実行は大賛成です。比較スクリプトを実行すると、6秒と11秒になりました。番号から文字列への 操作のせいで、一回で済ませるのが良い。

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

// Переводит в строку курс
string KursS(double Ku) {
int k, i;
string S; // 8 дробных цифр для составного курса открытия позиции в MT5
S=DoubleToString(NormalizeDouble(Ku,8),8); // Уберем концевые нули
i=StringLen(S)-1;
if (StringSubstr(S,i,1)!="0") return(S); // Их нет
for (k=i-1;k>0;k--) if (StringSubstr(S,k,1)!="0") {S=StringSubstr(S,0,k+1); break;}
i=StringLen(S)-1; // Уберем концевую точку
if (StringSubstr(S,i,1)==".") S=StringSubstr(S,0,i);
return (S);
} // KursS

// Переводит в строку курс    Вот так короче!!!  Строк меньше и в каждой строке прозрачнее
string Kurs(double Ku)
{
  string S="0";   int n=8;     // Количество знаков дробной части
  while(S[StringLen(S)-1]=='0'  && n>=0)
  {
    S=DoubleToString(Ku,n); // n дробных цифр
    n--;
  }
  return (S);
} // Kurs   

void OnStart() {
  string S;
  datetime TBeg,T1, T2;
  double x;
  int N,i;
  N=10000000; x=0.2;
  TBeg=TimeLocal();
  for (i=0;i<N;i++) S=KursS(x);
  T1=TimeLocal()-TBeg;
  TBeg=TimeLocal();
  for (i=0;i<N;i++) S=Kurs(x);
  T2=TimeLocal()-TBeg;
  Alert ("KursS -",(long)(T1),"сек   Kurs - ",(long)(T2),"сек");
  }
 
LRA:

このようにリワークして、行っています。

その様子はどのように理解されていますか?2本の水平線はできて いるのでしょうか?ログにはエラーはありませんが、スクリプトの開始後に行が表示されません

AUDCADではうまくいってラインができたのに、AUDCHFとEURUSDではできなかったのは不思議です...。

わかったような気がする・・・。すでに水平線が引かれているチャートには表示されません。それらを削除してスクリプトを実行すると、線が表示されます。しかし、なぜ登場するのでしょうか?質問です。

 
LRA:
ラインや、同じ名前の 別のオブジェクトを再作成することは禁止されている
いや...この線は私が手書きしたもので、名前がついていません。
 

どんなものにも名前がついています。グラフィック上で右クリック→オブジェクトの一覧表示


 
LRA:
横線名で時間保存が可能
ありがとうございましたが、名前がコメントで占められている、トレンドラインは、両方の価格が同じ時間、最初の時間は0であり、第二は正しいものです適している...これはおそらく、最も合理的である。