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

 
Artyom Trishkin:
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
サンキュー、モデレーター)
 
trader781:

こんにちは、皆さん、私たちがすでに持っているものに磨きをかけています。

不規則なグリッドのオーダーと、どこにでもあるような水平な 線を

これを実施する必要があります。

価格が線より下にある場合、すべての注文を終了します。

困難な点は以下の通りです。

1) オーダーが非均一なタイプで、すでにラインを設定するときにすべてが行われ、マーキングを配置してラインを設定するときには行われない場合(この場合、オン/オフフラグも設定する必要があります)。

2) ラインの右上にタイプ別の銘版を実装(この価格で注文が閉じられた場合、結果は残高と同じになる、つまり、我々は毎ティック、またラインを移動するときに表示を変更しなければならない。これは基本的にトレーリングストップや手動発注の場合のSLと似ているが、フローティングのみで、最初は誤ったトリガーの可能性もある)

ロボットはそこにあり、数字マーカーを除けばすべて描かれている。問題は、グリッド全体の値の正しい割り当てと情報処理である。

これを見てください、もしかしたらうまくいくかもしれません。
TralingLine
TralingLine
  • 投票: 13
  • 2016.09.26
  • Alexey Viktorov
  • www.mql5.com
Виртуальный Stop Loss или Trailing Stop.
 
Alexey Viktorov:
これを見てください、もしかしたら合うかもしれません。
ええ、必要なのはこれだけです。あとは4用にどう改造するかですね。
 
Nauris Zukas:
こんにちは。iTimeが時々間違った時間を表示するのは理解できない。新しいキャンドルPERIOD_H1のオープニングは、ログに時間を表示する必要があります Print(iTime(NULL,PERIOD_M1,30)).テストではすべて正しく表示されるが、実際には数時間でも時間がずれることがある。なぜそうなのでしょうか。
ヴィタリー・ムジチェンコ

CopyTimeを 使用してください。私もグラフィカルオブジェクトを構築する際にこの問題に気づきましたが、CopyTimeで 問題が解決しました。

datetime TM[];
if(CopyTime(Symbol(),Period(),0,1,TM)<0) return;
TIME0=TM[0];
RefreshRates()関数で設定できるのかなと思いました。もしかしたら、これも役に立つかも?
 
Nauris Zukas:
RefreshRates()は入れられるのかなと思いました。もしかしたら、それも役に立つかも?
試さず、すぐに通常のユニバーサルソリューションを適用し、問題を忘れました。
 
Vitaly Muzichenko:
試さず、普通の万能液を一気に塗って、問題を忘れていました。
OK、興味本位で、ある端末でRefreshRates()、別の端末でCopyTimeでやって みます。
 
trader781:
はい、これでだいたい必要なものが揃いました。あとは4へのアップグレード方法を考えるだけです。
まずはmql4用にコンパイルしてテストするだけです。動作するはずです。そうでない場合は、古いmql4のコードを紹介します。そして、エラー処理 でも。

//*******************************************************************|
//|                                                  TralingLine.mq4 |
//|                                       Copyright © 2010, Viktorov |
//|                                                   v4forex@qip.ru |
//*******************************************************************|
#property copyright "Copyright © 2010, Viktorov"
#property link      "v4forex@qip.ru"

extern int     StopLevel   = 7;
extern color   ColorLine   = IndianRed;
extern bool    comment     =  false;

double prbuys, prsels, TICKVALUE, FixProfitBuy, FixProfitSel;
int Buy, Sel;

//****************expert initialization function*********************|
   bool     run         = True,
            Error       = False;
   int      slip        =  3;
   double   point,
            STOPLEVEL;
int init()
  {
  point  = Point;
  if((Digits == 3 || Digits == 5))
  {
  point  = Point*10;
  slip   *= 10;
  }
  run = True;
  Error = False;
TICKVALUE = MarketInfo(Symbol(), MODE_TICKVALUE);

   return(0);
}//******************************************************************|
double   nd(double v){return(NormalizeDouble(v,Digits));}
string   dts(double v){return(DoubleToStr(v, Digits));}
string   dts2(double v){return(DoubleToStr(v, 2));}
string   ttss(int v){return(TimeToStr(v,TIME_SECONDS));}
//*******************************************************************|
//|                     expert start function                        |
//*******************************************************************|
int start()
  {
     double nprbuys, nprsels;
   CountTrades();
  
   if(Buy > 0 && ObjectFind("StopBuy") == -1) drawline(OP_BUY);
   if(Sel > 0 && ObjectFind("StopSel") == -1) drawline(OP_SELL);
   if(ObjectFind("StopBuy") != -1)
   nprbuys = ObjectGetValueByShift("StopBuy", 0);
   if(ObjectFind("StopSel")!=-1)
   nprsels = ObjectGetValueByShift("StopSel", 0);
  
   if(nprbuys > 0 && Bid <= nprbuys)
   {
    CloseOrder(OP_BUY);
    if(ObjectFind("StopBuy") != -1) ObjectDelete("StopBuy");
   }
   if(nprsels > 0 && Ask >= nprsels)
   {
    CloseOrder(OP_SELL);
    if(ObjectFind("StopSel") != -1) ObjectDelete("StopSel");
   }
      FixProfit();
    if(comment)
   Comment("\n Текущее время  ", ttss(TimeCurrent())
         , "\n Ордера Buy закроются по цене ", dts(nprbuys), ". Фиксированная прибыль ", dts2(FixProfitBuy)
         , "\n Ордера Sell закроются по цене ", dts(nprsels), ". Фиксированная прибыль ", dts2(FixProfitSel)
         );
   return(0);
}//******************************************************************|
  
//********************Подсчёт профита всех ордеров*******************|
void FixProfit()
{  double LineB, LineS, Profit, tv;
   LineB = nd(ObjectGetValueByShift("StopBuy", 0));
   LineS = nd(ObjectGetValueByShift("StopSel", 0));
    tv = TICKVALUE; FixProfitBuy = 0; FixProfitSel = 0;
     int Total = OrdersTotal();
  
   for(int i = Total-1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
     if(OrderSymbol() == Symbol())
       {
        if(OrderType() == OP_BUY && LineB > 0)
         {
          if(StringSubstr(Symbol(),0,3) == "USD") tv = TICKVALUE*Bid/LineB;
          FixProfitBuy += (OrderCommission() + OrderSwap() + (LineB - OrderOpenPrice())*tv*OrderLots()/Point);
         }
        if(OrderType() == OP_SELL && LineS > 0)
         {
          if(StringSubstr(Symbol(),0,3) == "USD") tv = TICKVALUE*Bid/LineS;
          FixProfitSel += (OrderCommission() + OrderSwap() + (OrderOpenPrice() - LineS)*tv*OrderLots()/Point);
         }
       }
     Profit += OrderProfit();
     }
    }
}//******************************************************************|

//*******Подсчёт открытых ордеров OP_BUY & OP_BUYSTOP****************|
        void CountTrades()
           {   Buy = 0; Sel = 0;
            int Total = OrdersTotal();
            for(int i = 0; i < Total; i++)
             {
              if(OrderSelect(i, SELECT_BY_POS))
              {
              if(OrderSymbol() == Symbol())
               {
               if(OrderType() == OP_BUY) Buy++;
                  if(OrderType() ==  OP_SELL) Sel++;
               }
              }
             }//for
           }//*******************************************************|

//**********************рисование линий******************************|
void drawline(int sig)
{
   double   Otstup_ = StopLevel*point;
    if(sig == OP_BUY)
     {
      prbuys = nd(iLow(NULL, 0, 1)-Otstup_);
       ObjectCreate("StopBuy", OBJ_TREND, 0, Time[0]+2*Period()*60, prbuys, Time[0]+4*Period()*60, prbuys);
       ObjectSet("StopBuy", OBJPROP_COLOR, ColorLine);
       ObjectSet("StopBuy", OBJPROP_STYLE, STYLE_DOT);
     }
    if(sig == OP_SELL)
     {
      prsels = nd(iHigh(NULL, 0, 1)+Otstup_);
       ObjectCreate("StopSel", OBJ_TREND, 0, Time[0]+2*Period()*60, prsels, Time[0]+4*Period()*60, prsels);  
       ObjectSet("StopSel", OBJPROP_COLOR, ColorLine);
       ObjectSet("StopSel", OBJPROP_STYLE, STYLE_DOT);
     }
   return;
}//******************************************************************|

//********************Закрытие ордеров*******************************|
void CloseOrder(int sig)
{     double GH, FE, c = 0; bool OrdClose; int Total = OrdersTotal();

            for(int i = 0; i < Total; i++)
              {
               OrdClose = False;
   if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES) && OrderSymbol() == Symbol())
      {
      if(OrderType() == sig)
       {
      while(!OrdClose) // Цикл закрытия ордера 8 попыток
            {
      RefreshRates();
        if(OrderType() == OP_BUY)  GH = Bid;
   else if(OrderType() == OP_SELL) GH = Ask;
      OrdClose =  OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(GH, Digits), slip, CLR_NONE);
               if(OrdClose) i--;
         if(!OrdClose)
         {
      FE = Fun_Error(GetLastError());
            if(FE == 1) {  continue;   } // Повторная попытка
       else if(FE == 0) { Print("Неудачная попытка CloseOrder Error = ", GetLastError()); return;}
       else {  Print("Неудачная попытка CloseOrder"); return;   }
         }
            } // Цикл while(c < 8)
       }
      }
              }//for
   return;
}//******************************************************************|

//*********************Ф-ия обработки ошибок*************************|
int Fun_Error(int error)
{
      switch(error)
   { // Преодолимые ошибки
   case 0: return(1);
   case 4: //Print("Торговый сервер занят. Пробуем ещё раз...");
   Sleep(500); // Простое решение
   return(1); // Выход из функции
   case 128:   //Истек срок ожидания совершения сделки
   return(1);
   case 6: //Print("Нет связи с торговым сервером. Пробуем ещё раз...");
   Sleep(10000); // Простое решение
   return(1); // Выход из функции
   case 129: //Print("Цена изменилась. Пробуем ещё раз...");
   return(1); // Выход из функции
   case 132: //Print("Рынок закрыт. Пробуем ещё раз...");
   Sleep(123000); // Простое решение
   return(1); // Выход из функции
   case 135: //Print("Цена изменилась. Пробуем ещё раз...");
   RefreshRates(); // Обновим данные
   return(1); // Выход из функции
   case 136: //Print("Нет цен. Ждём новый тик...");
   while(RefreshRates()==false) // До нового тика
   Sleep(1); // Задержка в цикле
   return(1); // Выход из функции
   case 137: //Print("Брокер занят. Пробуем ещё раз...");
   Sleep(500); // Простое решение
   return(1); // Выход из функции
   case 138: //Print("Новые цены. Пробуем ещё раз...");
   Sleep(1); // Задержка в цикле
   return(1); // Выход из функции
   case 146: //Print("Подсистема торговли занята. Пробуем ещё...");
   Sleep(500); // Простое решение
   return(1); // Выход из функции
   case 4107: //Print("Неправильный параметр цены для торговой функции. Пробуем ещё...");
   Sleep(50); // Простое решение
   return(1); // Выход из функции
// Критические ошибки
   case 1:
   return(0);
   case 2: Alert("Общая ошибка. Перегрузите терминал и\или компьютер.");
   return(0); // Выход из функции
   case 5: Alert("Старая версия терминала.");
   //Work=false; // Больше не работать
   return(0); // Выход из функции
   case 64: Alert("Счет заблокирован.");
   //Work=false; // Больше не работать
   return(0); // Выход из функции
   case 130: //Alert("Неправильные стопы.");
   return(0); // Выход из функции
   case 133: Alert("Торговля запрещена.");
   return(0); // Выход из функции
   case 134: Alert("Недостаточно денег для совершения операции.");
   return(0); // Выход из функции
   case 4051: Alert("Недопустимое значение параметра функции.");
   return(0); // Выход из функции
   case 4108: Alert("Неверный номер тикета.");
   return(0); // Выход из функции
   default: //Print("Возникла ошибка ",Error); // Другие варианты
   return(0); // Выход из функции
   }
}//******************************************************************|

//****************expert deinitialization function*******************|
int deinit()
  {
  ObjectDelete("StopBuy");
  ObjectDelete("StopSel");
   return(0);
}//******************************************************************|

 
Nauris Zukas:
では、片方の端末ではRefreshRates()で、もう片方の端末ではCopyTimeでやってみましょう。
テスターではタイムシフトの問題がしっかり出ていたので、RefreshRatesでは解決できないかもしれません。
 
Vitaly Muzichenko:
時間オフセットの問題はテスターでしっかり表示されたので、RefreshRatesでは解決できないかもしれません。
なるほど、それならCopyTimeで やればいいんですね。
 

1.Expert Advisor、Indicators、Scriptを端末間で同期させる便利なツールはありますか?(例えば、私は1つの端末でプログラムを作成し、その後、Expert Advisorを私が取引する端末に送信する必要があります)。

2.作業中のチャートでEAを自動更新(新バージョン読み込み)する例はありますか?