#property copyright"ExpoMe"#property link"http://www.metaquotes.net"#property indicator_chart_window#property indicator_buffers1#property indicator_color1 Blue
#property indicator_width12#property indicator_style10double Buffer1[];
//+------------------------------------------------------------------+//| Объявляем внешние переменные |//+------------------------------------------------------------------+datetime point_1;
datetime point_2;
datetime point_3;
datetime LastBarTime;
string line_name[10];
int gg=1;
int x1;
int x2;
int x3;
int xx1; // В эту переменную сохраняется значение номера бара вершины перед прогоном при появлении нового бара.int xx2; // Если линии стоят, значит при поялвении нового бара номер бара вершины должен увеличиться на 1.int xx3; // Если этого не произошло и xx1=x1 после прогона, значит увеличиваем вручную.int max;
int maxx;
double y1;
double y2;
double y3;
double y11;
double y22;
double y33;
double x11;
double x22;
double x33;
double y;
double a1;
double a2;
double a3;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int init()
{SetIndexBuffer(0,Buffer1);
SetIndexStyle(0,DRAW_LINE);
//---- indicators//----return(0);
}
int start()
{
// Пересчитываем инликатор только при появлении нового бараif(LastBarTime == iTime(Symbol(), 0, 0))
return(0);
LastBarTime = iTime(Symbol(), 0, 0);
// Присваиваем значения переменных времениint obj_total=ObjectsTotal();
for(int ii=0;ii<100;ii++)
{string name = ObjectName(ii);
if(ObjectType(name)!=OBJ_VLINE)
continue;
line_name[gg] = ObjectName(ii);
gg=gg+1;
}
point_1=ObjectGet(line_name[1], OBJPROP_TIME1);
point_2=ObjectGet(line_name[2], OBJPROP_TIME1);
point_3=ObjectGet(line_name[3], OBJPROP_TIME1);
// Запоминаем текущий номер бара вершины
xx1=x1;
//Определяем номера баров ключевых точекfor (int j=0;j<Bars; j++)
{ if (Time[j]==point_1) x1=j;}
// Если после прогона сдвиг по вершине не произошел, значит линий нет, добавляем +1 вручную.if (x1==xx1) x1=x1+1;
xx2=x2;
for (int k=0;k<Bars; k++)
{if (Time[k]==point_2) x2=k; }
if (x2==xx2) x2=x2+1;
xx3=x3;
for (int l=0;l<Bars; l++)
{if (Time[l]==point_3) x3=l; }
if (x3==xx3) x3=x3+1;
// Comment ("n1=", j," n2=", k, " n3=", l);//Находим "высоту" вершин
{
y1=High[x1];
y2=High[x2];
y3=High[x3];
//Comment ("y1=", y1," x1=", x1, " y2=", y2, "x2=", x2," y3=", y3, " x3=", x3);//Принимаем первую из них за начало координат
a1=(y3-(x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1))/(x3*(x3-x1-x2)+x1*x2);
a2=((y2-y1)/(x2-x1))-a1*(x1+x2);
a3=((x2*y1-x1*y2)/(x2-x1))+a1*x1*x2;
max=MathMax(x1,x2);
maxx=MathMax(max,x3);
for (int i=maxx; i>=0; i--)
{ y=a1*i*i+a2*i+a3;
Buffer1[i]=y;}
return(0);
}}
ルールを読むEAは、インストルメントとTFの両方において制限なく動作する必要があります。
ありがとうございました。他にもいろいろとミスがありました)
ArrayInitialize(array,EMPTY_VALUE);
こんな感じ double msArr[10][4][500];
あるいは、MKL4ではループ内だけ でしかできない。
ArrayInitialize(array,EMPTY_VALUE);
こんな感じ double msArr[10][4][500];
あるいは、MKL4ではループでしかできない ことです。
また、ArrayFillやZeroMemoryもあります。
多次元配列をArrayFill()で処理すると1次元に見える。例えば、array[2][4]はarray[8]として処理されるので、この配列を扱う場合は初期要素のインデックスを5と指定しても良い。したがって、array[2][4]に対してArrayFill(array, 5, 2, 3.14)を呼ぶと、array[1][1]とarray[1][2]に値3.14が充填されることになります。
ArrayFillとZeroMemoryもあります。
こっちだ!
そして、あなたはジョーカーです。そして問題は現実で、PrintコマンドがExpertsタブに2回印刷され、Allertも2回出るという話題がありますが、残念ながら直し方の回答はありません。また、今後のために、わからなければ黙って通り過ぎればいいのですが、専門外の回答で自ら評価を得るのは愚かなことです。はい、それにしても、皆さんの回答は本当に弱いですね。
ジョーカーなんですね。しかし、問題は現実で、PrintコマンドがExpertsタブに2回印刷され、Allertも2回出るという話題があるが、どうすれば解決できるのか、残念ながら回答はない。また、今後のために、わからなければ黙って通り過ぎればいいのですが、専門外の回答で自ら評価を得るのは愚かなことです。はい、それにしても、皆さんの回答は本当に弱いですね。
私のリンクを理解してなかったのか...。
プリントは2回以上プリントされません。もしプリントされるなら、コードにエラーがあります。あなたがコードを投稿していないので、テレパシーに送ったのはそのためです)
おやすみなさい!
フォーラムユーザーの皆様、助けてください。MQL4で、チャート上の与えられた3つのポイントを元に、数式で線を引くスクリプトを書きました。インデントやスペースを含めて130行かかる。最近、MQL5に移植することにしたのですが、私のプログラミングの乏しい知識ではどうにもならないことに気づき、もう一度勉強し直さなければなりません。
どなたか、このスクリプトをMQL5に移植してくださる方がいらっしゃれば、ありがたいのですが。このスクリプトをMQL5に移植してくださる方がいらっしゃれば幸いです。
誰か無料でやってくれると嬉しい(C)。
ここにコードを放り込めば、誰かがプロボノ(c)をしてくれるかもしれない、そんなこともあるんだ。