MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 101

 
Vitaly Muzichenko:
明確ではありません。EAを停止する必要がある場合は、提案されたバリアントがこれに対処し、停止する必要がない場合は、EAを取引させ、いかなる方法でも制限しないようにします。我々は停止した後にオンデマンドで取引したい場合は、時間を切り替えるだけで十分です、無効は真となり、プログラムが動作し続けるでしょう
OK、ありがとうございます。
 
trader781:
OK、ありがとうございます。

入力パラメーターに「寄り付きで取引するか、寄り付きで取引しないか」を指定できるようにしたいのではないでしょうか?

そうであれば、どうぞ。

extern bool OneTrade = true;

// OnTick
if(OneTrade && !Disabled) return;

フラッグで失敗したわけではありません。

 
Vitaly Muzichenko:

入力パラメータに「寄り付きで取引するか、寄り付きで取引しないか」を指定できるようにしたいのではないでしょうか?

そうであれば、どうぞ。

extern bool OneTrade = true;

// OnTick
if(OneTrade && !Disabled) return;

私は旗に悪いことはしていないようです

なるほど、そういうことだったのか。きちんと配置すれば、1つの変数で十分だと思ったからです。
 
Vitaly Muzichenko:

ありがとうございました。

問題は、このエントリーがどの程度正しいかということです。プログラム全体を通して、Time[0]とTime[1]がたくさん使われているのに対して、プログラムの最初にあり、毎回呼ばれるわけではなく、変数に書かれているのです。配列の 外側にエラーはないようですが、すべて表面的に定義されています。

datetime TM[], TIME0, TIME1;

//------------
void OnTimer()

ArraySetAsSeries(TM, true);
  if(CopyTime(_Symbol, PERIOD_CURRENT, 0, 2, TM)==-1) return;
   TIME0 = TM[0];
   TIME1 = TM[1];

ありがとうございます。

基本的に変数にアクセスしても配列のセルにアクセスしても変わりません。 取得速度だけかもしれませんが、変数で測定したり、配列に直接アクセスしたりと微々たるものだと思います。
 
Vitaly Muzichenko:

少し調整してもらっていいですか?

現在の価格に 線を入れる

または、これが利用可能なEAへのリンク。

botのパラメータをどのように配分すれば動作するのか理解したい

 
trader781:

少し調整してもらっていいですか?

現在の価格に 線を入れる

または、これが利用可能なEAへのリンク。

botのパラメータをどのように配分すれば動作するのか理解したい

まず、引用符の表示を90度回転させる必要があります。
 
Alexey Viktorov:
まず、見積もり表示を90度回転させる必要があります。

998を投稿する。

横型でも縦型でもいいんです。ただ、今、私がそこでやったことがうまくいかないんです

 
trader781:

998を投稿する。

横でも縦でもいいんです。ただ、今まではそこでやっていたことがうまくいかなくなったんです

いや、申し訳ないが入り込めない。
 
よく、トローリングや損益分岐の機能を求められることがありますね。私は、与えられたブレークイーブンレベルにストップを移動させ、関数に渡された価格チャート上にそのラインを描くいくつかの指標(例えば、MAまたは放物線)の値によってストップポジションをトレールする青写真関数を作成しました。

#property strict // в самое начало кода вашей программы (если нету там ещё)


// Функцию - за пределы остальных функций программы
//+------------------------------------------------------------------+
//| Трейлинг по значению + перенос стопа на уровень безубытка        |
//+------------------------------------------------------------------+
void TrailingByLevel(string symbol_name,           // Имя символа
                     int magic_number,             // Magic ордера
                     double level_of_trail,        // Уровень, на который ставим стоп (например МА или Parabolic SAR)
                     int trailing_start,           // Профит в пунктах для старта трала
                     int trailing_step,            // Шаг трала в пунктах
                     int trailing_stop,            // Отступ стоплосс от уровня МА или SAR в пунктах
                     int profit_for_breakeven=15,  // Профит в пунктах для переноса стопа в безубыток
                     int breakeven_level=5,        // Уровень безубытка в пунктах
                     bool use_trail=true,          // Флаг использования трала
                     bool use_breakeven=false      // Флаг использования безубытка
                     )
   {
   int lv=StopLevel(symbol_name)+1;                // Получаем значение Stop Level по символу + 1 пункт (из отдельной функции)
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS)) {
         if(OrderMagicNumber()!=magic_number)   continue;         //Если Магик не наш - идем к следующему ордеру
         if(OrderSymbol()!=symbol_name)         continue;         //Если Символ не наш - идем к следующему ордеру
         //--- покупки
         if(OrderType()==OP_BUY) {
            int    digits=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
            double point=(SymbolInfoDouble(symbol_name,SYMBOL_POINT));
            double pb=SymbolInfoDouble(symbol_name,SYMBOL_BID);
            double profit=pb-OrderOpenPrice();                    // Профит позиции в цене (без комиссий и свопов)
            //--- безубыток
            if(use_breakeven) {
               //--- если профит в цене больше заданного
               if(profit>=profit_for_breakeven*point) {
                  int err=ERR_NO_ERROR;
                  double sl=NormalizeDouble(OrderOpenPrice()+breakeven_level*point,digits);
                  if(pb-lv*point>sl && OrderStopLoss()<sl) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                  if(err==ERR_MARKET_CLOSED) return;
                  }
               }
            //--- трал
            if(use_trail) {
               //--- если профит в пунктах больше заданного, или изначально задан меньше ноля
               if(profit>=trailing_start*point || trailing_start==EMPTY) {
                  int err=ERR_NO_ERROR;
                  double sl=NormalizeDouble(level_of_trail-trailing_stop*point,digits);  // вычисляем новый уровень стоплосс по значению, переданному в функцию
                  //--- Если новое значение СЛ не ближе Stop Level и если новое положение СЛ больше старого+шаг СЛ, то модифицируем стоп позиции
                  if(pb-lv*point>sl && OrderStopLoss()+trailing_step*point<sl) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                  if(err==ERR_MARKET_CLOSED) return;
                  }
               }
            }

         //--- Продажи
         if(OrderType()==OP_SELL) {
            int    digits=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
            double point=(SymbolInfoDouble(symbol_name,SYMBOL_POINT));
            double pa=SymbolInfoDouble(symbol_name,SYMBOL_ASK);
            double profit=OrderOpenPrice()-pa;                    // Профит позиции в цене (без комиссий и свопов)
            //--- безубыток
            if(use_breakeven) {
               //--- если профит в цене больше заданного
               if(profit>=profit_for_breakeven*point) {
                  int err=ERR_NO_ERROR;
                  double sl=NormalizeDouble(OrderOpenPrice()-breakeven_level*point,digits);
                  if(pa+lv*point<sl && (OrderStopLoss()>sl || OrderStopLoss()==0)) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                  if(err==ERR_MARKET_CLOSED) break;
                  }
               }
            //--- трал
            if(use_trail) {
               //--- если профит в пунктах больше заданного, или изначально задан меньше ноля
               if(profit>=trailing_start*point || trailing_start==EMPTY) {
                  int err=ERR_NO_ERROR;
                  double sl=NormalizeDouble(level_of_trail+trailing_stop*point,digits);  // вычисляем новый уровень стоплосс по значению, переданному в функцию
                  //--- Если новое значение СЛ не ближе Stop Level и если новое положение СЛ больше старого+шаг СЛ, то модифицируем стоп позиции
                  if(pa+lv*point<sl && (OrderStopLoss()-trailing_step*point>sl || OrderStopLoss()==0)) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                  if(err==ERR_MARKET_CLOSED) break;
                  }
               }
            }
         }
      }
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+
一般的に、何かあれば - 尋ねてください。あるいは正しい。
 
Artyom Trishkin:
よく、トローリングや損益分岐の機能を求められることがありますね。私は、与えられたブレークイーブンレベルにストップを移動させ、関数に渡された価格チャート上にそのラインを描くいくつかの指標(例えば、MAまたは放物線)の値によってストップポジションをトレールする青写真関数を作成しました。


一般的に、何かあれば - 尋ねてください。または正しい
こんにちはアーテム、そして何CodeBaseであなたはそれを配置しないのですか?少なくとももう1つ正しいコードがあるはずです。