// Предварит.обработкаif(High[0]!=Low[0]) return; //если бар открылся до поступления текущей котировки, выход из start
vverh = iCustom(NULL,0,"Индикатор дающий точку на покупку",Glubina,Pogreshnost,0,0); //значение индикатора на покупку
vniz = iCustom(NULL,0,"Индикатор дающий точку на продажу",Glubina,Pogreshnost,1,0); //значение индикатора на продажуif(vverh==0 && vniz==0)
{
Alert("Сигнала нет. Эксперт ждёт сигнал.");
return;
}
if(Bars < Glubina) // Недостаточно баров
{
Alert("Недостаточно баров в окне. Эксперт не работает.");
return; // Выход из start()
}
if(Work==false) // Критическая ошибка
{
Alert("Критическая ошибка. Эксперт не работает.");
return; // Выход из start()
}
//--------------------------------------------------------------- 4 --// Учёт ордеров
Symb=Symbol(); // Название фин.инстр.
Total=0; // Количество ордеровfor(i=1; i<=OrdersTotal(); i++) // Цикл перебора ордеров
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:if (OrderSymbol()!=Symb)continue; // Не наш фин. инструмif (OrderMagicNumber()!=MagicNumber) // Попался ордер открытый не советникомcontinue;
Total++; // Счётчик ордеров открытых советникомif (Total>1) // Не более одного орд
{
Alert("Несколько ордеров одного советника. Эксперт не работает.");
return; // Выход из start()
}
Ticket=OrderTicket(); // Номер выбранн. орд.
Tip =OrderType(); // Тип выбранного орд.
Price =OrderOpenPrice(); // Цена выбранн. орд.
SL =OrderStopLoss(); // SL выбранного орд.
TP =OrderTakeProfit(); // TP выбранного орд.
Lot =OrderLots(); // Количество лотов
}
}
//--------------------------------------------------------------- 5 --// торговые критерииif(vverh>0)
{
Opn_B=true;
Cls_S=true;
Opn_S=false;
Cls_B=false;
}
if(vverh>0)
{
Opn_S=true;
Cls_B=true;
Opn_B=false;
Cls_S=false;
}
//--------------------------------------------------------------- 6 --//расчет стопов
i_stop=0;
while (stopov_for_S<2) //ищем 2 последних точки стопа в индикаторе, выбираем изз них самую дальнюю от текущей цены
{
for_S = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,0,i_stop);
if (for_S>0)
{
stopov_for_S++;
if(Stop_for_S<for_S) Stop_for_S=for_S;
}
i_stop++;
}
i_stop=0;
while (stopov_for_B<2)
{
for_B = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,1,i_stop);
if (for_B>0)
{
stopov_for_B++;
if(Stop_for_B<for_B) Stop_for_B=for_B;
}
i_stop++;
}
SL_for_B = Stop_for_B-pogreshnostSL;
SL_for_S = Stop_for_S+pogreshnostSL;
TP_for_B=vverh+(vverh-Stop_for_B)*koeff_dvizheniya;
TP_for_S=vniz-(Stop_for_S-vniz)*koeff_dvizheniya;
// Закрытие и модификация ордеровwhile(true) // Цикл закрытия и модификации орд.
{
if (Tip==0 && Opn_B==true) // Если открыт ордер БАЙ и индикатор дает сигнал на покупку
{
OrderModify(Ticket,SL_for_B,TP_for_B,0,CLR_NONE); //меняем стопы текущего ордера байbreak;
}
if (Tip==0 && Opn_S==true) // Если открыт ордер БАЙ и индикатор дает сигнал на продажу
{
RefreshRates();
Ans=OrderClose(Ticket,Lot,Bid,50); // закрываем БАЙif (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер Buy ",Ticket);
break; // Выход из цикла закр
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попытка
}
if (Tip==1 && Opn_S==true)
{
OrderModify(Ticket,SL_for_S,TP_for_S,0,CLR_NONE);
break;
}
if (Tip==1 && Opn_B==true)
{
RefreshRates();
Ans=OrderClose(Ticket,Lot,Ask,50);
if (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер Sell ",Ticket);
break; // Выход из цикла закр
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попытка
}
}
//--------------------------------------------------------------- 7 --// Стоимость ордеров
RefreshRates(); // Обновление данных
Min_Lot=MarketInfo(Symb,MODE_MINLOT); // Миним. колич. лотов
Free =AccountFreeMargin(); // Свободн средства
One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
Step =MarketInfo(Symb,MODE_LOTSTEP); // Шаг изменен размераif (Lots > 0) // Если заданы лоты,то
Lts =Lots; // с ними и работаем else// % свободных средств
Lts=MathFloor(Free*Prots/One_Lot/Step )*Step;// Для открытияif(Lts < Min_Lot) Lts=Min_Lot; // Не меньше минимальнif (Lts*One_Lot > Free) // Лот дороже свободн.
{
Alert(" Не хватает денег на ", Lts," лотов");
return; // Выход из start()
}
//--------------------------------------------------------------- 8 --// Открытие ордеровwhile(true) // Цикл закрытия орд.
{
Ticket=0;
if (Opn_B==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данныхAlert("Попытка открыть Buy. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,50,SL_for_B,TP_for_B,"My order #",MagicNumber,0,CLR_NONE);//Открытие Buyif (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попыткаreturn; // Выход из start()
}
if (Opn_S==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данныхAlert("Попытка открыть Sell. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,50,SL_for_S,TP_for_S,"My order #",MagicNumber,0,CLR_NONE);//Открытие Sellif (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попыткаreturn; // Выход из start()
}
}
//--------------------------------------------------------------- 9 --return; // Выход из start()
}
If (торговые условия сигнал №1)
{
}// Какой код нужен, чтобы тело оператора №1 в случае соответствия, передало управление к оператору «торговых условий №2»
If (торговые условия сигнал №2)
{
}// Какой код нужен, чтобы тело оператора №2 в случае соответствия, передало управление к оператору «торговых условий №3 и №4»
If (торговые условия сигнал №3)
{
Opn_B=true;
}
else
If (торговые условия сигнал №4)
{
Opn_S=true;
}
elsereturn(0);
じゃあ、自分のところで調べてみてよ!コードの単語ごとに関数があり、変数でやりくりしているんですね。その分、コードが重くなるんです。関数がないとどうしようもないときは、関数を使うべきです!キムさんのコードで不要なものはすべてコメントしました。忘れてはいけないのは、「どうしたらいろいろな条件下でプログラムを速く走らせることができるか」ということをみんなに聞いたことだ。5分ですべてのダニを1年間検査することが可能になりました。すべての条件と関数を調べ、不要なものはすべて捨てました。
もちろん覚えていますよ。しばらくはこのままでいい。実際、私は習慣を変える必要があります。私のコードがわかりにくいというのは、プログラマーとして初めてのことではないでしょう。どうやらそうらしい・・・。
だから、自分のところで掘れ!コードの単語ごとに関数があり、 変数でやり くりしているんですね。だから、コードが重くなるんですね。 関数がないとどうしようもないときは、関数を使う べきです!キムさんのコードに不要なものをすべてコメントしたら、すべてとても速く動くようになりました。忘れてはいけないのは、「どうしたらいろいろな条件下でプログラムを速く走らせることができるか」ということをみんなに聞いたことだ。5分ですべてのダニを1年間検査することが可能になりました。すべての条件と関数を調べ、不要なものはすべて捨てました。
変数が不要になるのは、テスターでストラテジーをテストする場合のみ です。
実機では、ロジックを実行するために必要なすべての値を、適切なタイミングで計算しなければならない。なぜなら、これらの変数の値は、例えば再起動時に非常に失わ れやすいからである。
皆さん、ごきげんよう。
インデックスの書き方はもうわかったのですが、最初のロボットに問題があるんです。論理的には正しいようで、コンパイラは文句を言わず、ジャーナルにもエラーはありませんが、テスターのExpert Advisorが動きません - チャートは開きますが、このグラフに動きはありません(チャートは動きません)。
考え方は次のとおりです。インジケータは、購入または売却するポイントを受け取った後、そこから(常に開口部とろうそくの始値で)ポイントを生成し、同時にロボットのタスクは、反対の順序を閉じて、新しいオープンまたは同じ方向に古い順序を変更します(停止とTPは別の指標によって発行されます)。
どこが間違っているのか、ヒントを頂ければ幸いです。
コードそのもの(機能に応じてインデックス名を変更、変数宣言と エラー処理部分を削除)。
問題の本質は次のようなものだ。演算子#1,2 の本文で波括弧の中に何を入れるか明確でない。実際には、取引条件の遵守が確認され、それ以上のアクションはない。
(4つの売買シグナルがあり、1番のトリガーで2番の処理シグナルに制御を渡し、2番のトリガーで3番と4番の処理シグナルに渡し、そこで売買操作を 行う)。
最後に追加する意味はあるのでしょうか?論理的には、シグナル#3,4がトリガーされない場合、Expert Advisorを再度起動する必要があります。
変数は、テスターでストラテジーをテストするときのみ使用 できます。
実世界では、ロジックの実行に必要なすべての値を適切なタイミングで計算する必要があります。これらの変数の値は、例えば再起動時に非常に失わ れやすいためです。
皆さん、ごきげんよう。
インデックスの書き方はもうわかったのですが、最初のロボットに問題があるんです。論理的には正しいようで、コンパイラは文句を言わず、ジャーナルにもエラーはありませんが、テスターのExpert Advisorが動きません - チャートは開きますが、このグラフに動きはありません(チャートは動きません)。
考え方は次のとおりです。インジケータは、購入または売却するポイントを受け取った後、そこから(常に開口部とろうそくの始値で)ポイントを生成し、同時にロボットのタスクは、反対の順序を閉じて、新しいオープンまたは同じ方向に古い順序を変更します(停止とTPは別の指標によって発行されます)。
どこが間違っているのか、ヒントを頂ければ幸いです。
コードそのもの(機能に応じてインデックス名を変更、変数宣言とエラー処理部分を削除)。
もし、チャート上の対応するウィンドウに表示されるインジケーターのコードではなく、EAの中だけでインジケーターの名前を変更した場合、EAにはすべてが表示されますが、インジケーターからのシグナルは受信されないため、EAは何も受信せずエラーも発生しません。指標名のスペルが同じかどうか確認しましょう
ご指摘ありがとうございます。今一度、すべてを確認しましたが、書き間違いはありません。私は、そのタスクを明確にするために、フォーラムの最初のメッセージのテキストで指標の名前を変更しただけで、Expert Advisorのテキストでは、インデックスの名前は、フォルダ "indicators "にある名前とまったく同じように書かれています。例えば、こんな感じです。"3.0_figuri_2.3_rasshirenie".
また、別のEA(チュートリアルより)を選択し、iCustom関数に存在しないインジケータの名前を入力しています。EAが本当に取引を停止したのです(これは理解できます)。しかし、テスターを起動すると、チャートは設定した開始日から設定した終了日まで動いていました。
もしかしたら、この問題に直面した人がいるかもしれませんね。
ご指摘ありがとうございます。今一度、すべてを確認しましたが、書き間違いはありません。私は、そのタスクを明確にするために、フォーラムの最初のメッセージのテキストで指標の名前を変更しただけで、Expert Advisorのテキストでは、インデックスの名前は、フォルダ "indicators "にある名前とまったく同じに書かれています。例えば、こんな感じです。"3.0_figuri_2.3_rasshirenie".
また、別のEA(チュートリアルより)を選択し、iCustom関数に存在しないインジケータの名前を入力しています。EAが本当に取引を停止したのです。(ところで、これは理解できるのですが)テスターを起動すると、チャートは設定した開始日から設定した終了日まで移動していました。
もしかしたら、そんな悩みを抱えている人がいたかもしれない。
ご指摘ありがとうございます。今一度、すべてを確認しましたが、書き間違いはありません。私は、そのタスクを明確にするために、フォーラムの最初のメッセージのテキストで指標の名前を変更しただけで、Expert Advisorのテキストでは、インデックスの名前は、フォルダ "indicators "にある名前とまったく同じように書かれています。例えば、こんな感じです。"3.0_figuri_2.3_rasshirenie".
また、別のEA(チュートリアルより)を選択し、iCustom関数に存在しないインジケータの名前を入力しています。何が起こったかというと、次のようなことでした。EAは本当に取引を停止したのですが(ちなみにこれは理解できます)、テスターを起動すると、チャートは設定した開始日から設定した終了日まで動いていたのです。
もしかしたら、そんな悩みを抱えている人がいたかもしれませんね。