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

 

親愛なる、私はいくつかの助けを必要としています。

チュートリアル(tradingexpert.mq4)から会計、開始、終了の注文のコードを取りました。 このコードは1つのポジションで動作するように意図されています。 5つのポジションが必要です。

以下のようにコードを少し修正しました(変更した行は太字)。これにより、ポジションは適切な量だけ開かれるようになりましたが、反転するときは、1つのポジションだけが閉じられ、反転したものがすぐに開かれるようになりました。

反転時に全てのポジションをクローズし、反対側のポジションのみオープンするようにするにはどうしたらよいでしょうか?

   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total>5)                           // Было не более одного орд, стало не более пяти
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
   // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Total < 5 && Opn_B==true)     // Открытых орд. нет +. Было Total < 1, стало Total < 5
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         SL=Bid - New_Stop(StopLoss)*Point;     // Вычисление SL откр.
         TP=Bid + New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
   // Закрытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Tip==0 && Cls_B==true)                // Открыт ордер Buy..
        {                                       //и есть критерий закр
         Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");
         RefreshRates();                        // Обновление данных
         Ans=OrderClose(Ticket,Lot,Bid,2);      // Закрытие Buy
         if (Ans==true)                         // Получилось :)
           {
            Alert ("Закрыт ордер Buy ",Ticket);
            break;                              // Выход из цикла закр
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
 
Forexman77:

親愛なる、私はいくつかの助けを必要としています。

チュートリアル(tradingexpert.mq4)から会計、開始、終了の注文のコードを取りました。 このコードは1つのポジションで動作するように意図されています。 5つのポジションが必要です。

以下のようにコードを少し修正しました(変更した行は太字)。これにより、ポジションは適切な量だけ開かれるようになりましたが、反転するときは、1つのポジションだけが閉じられ、反転したものがすぐに開かれるようになりました。

反転時にすべてのポジションを決済し、反対側のポジションのみをオープンするようにするにはどうしたらよいでしょうか。


Ticketを配列Ticket[5]とし、そこに5枚のチケットをすべて格納する。閉じるときは、すべてのチケットを適宜循環させる。
 
Vinin:

ライブラリの利用度合いで初心者と判断されることはないでしょう。あなたのコードを見た限りでは、それを理解するのに2週間はかかるでしょう。それ以上でなければ。だから、答えは出ないと思うんです。
Vitya、何も理解する必要はありません。この人は、ある「サンドボックス」(EAとそのライブラリ)から、他の「サンドボックス」(コンパイルされたライブラリ)でグローバル変数を 見えるようにしたいのです。:)))
 

私はプロゲーマーではなく、コードビルダーです。 そこで、このインジケータを作りました(ファイルTではなく、テキストで説明できるんですね)。

#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--------------------------------------------------------------------
double Buffer[];
//--------------------------------------------------------------------

int init()
{
SetIndexStyle(0,DRAW_HISTOGRAM, EMPTY, 2);
SetIndexBuffer(0,Buffer);
return(0);
}
// -------------------------------------------------------------------

int deinit()
{
return(0);
}
//--------------------------------------------------------------------

int start()
{
int StartBar = Bars - IndicatorCounted() - 1;
for(int i = StartBar; i >= 0; i--)
{
if(TimeDayOfWeek(Time[i]) < TimeDayOfWeek(Time[i+1]))
Buffer[i] = 0;
else
Buffer[i] = Buffer[i+1];
if(Close[i]>Close[i+1]&&Close[i+1]>=Close[i+2]){//если текущее и преддыдущее движение растут
Buffer[i] += NormalizeDouble((Close[i] - Close[i+1])/Point,0);}
if(Close[i]<Close[i+1]&&Close[i+1]<Close[i+2]){//если текущее и преддыдущее движение падают
Buffer[i] += NormalizeDouble((Close[i+1] - Close[i])/Point,0);}
if(Close[i]>Close[i+1]&&Close[i+1]<Close[i+2]){//если текущее лвижение растет а предыдущее падает
Buffer[i] += NormalizeDouble((Close[i+1] - Close[i])/Point,0);}
if(Close[i]<Close[i+1]&&Close[i+1]>=Close[i+2]){//если текущее движение падает а предыдущее растет
Buffer[i] += NormalizeDouble((Close[i] - Close[i+1])/Point,0);}
}
return(0);
}
//--------------------------------------------------------------------

前の動きがClose[i+2]からClose[i+1]に継続する場合、小さな時間枠では、現在の動きClose[i]が追加され、反対であれば - 減算されます - それは週の間にポイントの合計とそれらの合計のダイナミクスを示しています。私はプログラムがバーを閉じるのではなく、金曜日の終値を見るように処方する必要があります。 私はそれがDayOfWeekと5(金曜日の数字)で行うことができることを知っているが、私はどのように現実的にそれを行うことができますか? 助けて ください。

 
TarasBY:
Vitya、ここでは何も整理する必要はありません。この人は、あるサンドボックス(EAとそのライブラリ)のグローバル変数を、別のサンドボックス(コンパイルされたライブラリ)で見えるようにしたいのです。:)))

イゴール、ちょっと勘違い!サンドボックス」(コンパイルされたライブラリ)では、関数とすべての変数のみがインルーラーで宣言されています。また、インクルードファイルで宣言された変数は、梟の中に直接挿入されているため、梟の中でも見えるはずです。反対ですか?
 
Vitek2010:

私はプロゲーマーではなく、コードビルダーです。 そこで、このインジケータを作りました(ファイルTではなく、テキストで説明できるんですね)。

それはポイントの合計と週の間にそれらの合計のダイナミクスを示しています - より小さい時間枠で、前の動きがClose[i+2]からClose[i+1]に継続した場合、現在の動きClose[i]が追加され、反対した場合 - が減算されます。私はプログラムがバーを閉じるのではなく、金曜日の終値を見るように処方する必要があります。 私はそれがDayOfWeekと5(金曜日の数字)で行うことができることを知っているが、実際にそれを行うには? 助けて ください。


似合うかな?

//+------------------------------------------------------------------+
//|                                                    Vitek2010.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--------------------------------------------------------------------
double Buffer[];
//--------------------------------------------------------------------

int init()
  {
   SetIndexStyle(0,DRAW_HISTOGRAM,EMPTY,2);
   SetIndexBuffer(0,Buffer);
   return(0);
  }
// -------------------------------------------------------------------

int deinit()
  {
   return(0);
  }
//--------------------------------------------------------------------

int start()
  {
   int StartBar=Bars-IndicatorCounted()-1;
   if (StartBar>1) StartBar--;
   
   for(int i=StartBar; i>=0; i--)
     {
      Buffer[i]=Buffer[i+1];
      int pos0=iBarShift(NULL, PERIOD_W1, Time[i]);
      int pos1=iBarShift(NULL, PERIOD_W1, Time[i+1]);
      if (pos0==pos1) 
         Buffer[i]+=MathAbs(Close[i]-Close[i+1]);
      else 
         Buffer[i]=MathAbs(Close[i]-Close[i+1]);
     }
   return(0);
  }
//--------------------------------------------------------------------
 
hoz:

イゴール、ちょっと勘違い!関数だけがサンドボックス(コンパイルされたライブラリ)にあり、すべての変数はインルーラーで宣言されます。また、インクルードファイルで宣言された変数は、梟の中に直接挿入されているため、梟の中でも見えるはずです。そう思いませんか?
であれば、コンパイルされたライブラリへの参照は何の関係があるのでしょうか?
 
Vinin:


それでいいのか?

しかし、そのようなことはありません。私は説明します - あなたのフォーラムは、プログレの最後の有能な砦の希望のようなものです。そして、サイズの挿入 - それは書き込み PERIOD_W1がそれを見る方法ですが、サイズの使用も日付として固定基準点の使用も、望ましい効果を得る ことはありません。私は金曜日についての具体的な質問を投稿しました。ところで、あなたのコードは「バージョン」-不明なプロパティと書かれているため、コンパイルさ れません。
 
Vitek2010:
いや、そうではない。説明しよう。あなたのフォーラムは、プログレの最後の有能な砦への希望のようなもので、サイズの挿入 - それはそれが書き込みを見る方法です PERIOD_W1しかし、サイズの使用や日付として固定データムの使用はどちらも望ましい効果を得ることはありません。私は金曜日についての具体的な質問を投稿しました。ところで、あなたのコードは「バージョン」-不明なプロパティと書かれているため、コンパイルさ れません。

TimeDayOfWeek(Time[i])はTime[i]を指定せず、D'2014.01.27'のフォーマットで特定の日付を指定しています。

また、何曜日かを判断する必要がある場合は、 DayOfWeek() を呼び出すだけでよい。

 
evillive:

TimeDayOfWeek(Time[i])では、Time[i]ではなく、D'2014.01.27'というフォーマットで特定の日付を設定することになります。

また、何曜日かを判断したい場合は、 DayOfWeek() を呼び出せばよい。

TimeDayOfWeek() (例)について、どこでお知りになりましたか?:)))