[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 285

 
rid >> :

おそらく、https://www.mql5.com/ru/forum/107476/page21 という関数が役に立つでしょう。

関数 isCloseLastPosByTake()。
この関数は、テイク上の最後のポジションをクローズするフラグを返します。

フラグアップ - True - TakeProfitが発動された。

フラグを下げた - False - ポジションは別の理由で閉鎖されました。


関数そのものは、コードの一番最後に配置します。また、売るための条件も加えています。


皆さん、こんにちは。

すべて書いたとおりにやりました。コードの一番最後に関数を入れて、販売条件に追加しました。

if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {//продаем

と思い、購入のために追加しただけです。BUYだけでなく、SHELLでも注文を締め切ります。

最後にisCloseLasPosByTake()関数を挿入しています。

2;116;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;104:33;'(' - function definition unexpected
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:7;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:14;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:27;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:33;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:15;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:37;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:17;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:46;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;116:19;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;117:17;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;127:19;'sy' - variable not defined

そんなパイというか、ゴッツマン兵長の油絵を紹介します。ったく......何も知らねぇくせに......。

コード自体

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
    // Узнаем уровень стопов и спрэд
    int Spread = MarketInfo(Symbol(), MODE_SPREAD);
    int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

    // Рассчитываем значения средних на 0-ом и 1-ом барах
    double MAF_0 = iMA(NULL, 0, MAFP, 0, 1, 1, 0);
    double MAF_1 = iMA(NULL, 0, MAFP, 0, 1, 1, 1);
    double MAS_0 = iMA(NULL, 0, MASP, 0, 1, 1, 0);
    double MAS_1 = iMA(NULL, 0, MASP, 0, 1, 1, 1);
    
    // открытие позиции Buy покупка
    if( MAF_1 < MAS_1 && MAF_0 > MAS_0)
    if( isCloseLastPosByTake( NULL, OP_SELL, MagicNumber) ==true) {//покупаем
     if( CheckOrders(OP_SELL))
      {
       if( StopLoss <= StopLevel+ Spread)
         double SL = 0;
        else
         SL = Ask - StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         double TP = 0;
        else
         TP = Ask + TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Buy. Ошибка №", GetLastError()); 
       }
    
    // Открытие позиции Sell продажа  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {//продаем
     if( CheckOrders(OP_BUY))
      {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;
        else
         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;
        else
         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
       }
       bool isCloseLastPosByTake(string sy=NULL, int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy || sy==NULL) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) {
                t=OrderCloseTime();
                j= i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect( j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo( sy, MODE_DIGITS);
    if ( dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if ( ocp== otp) return( True);
  }
  return( False);
}
//----
   return(0);
  }//+------------------------------------------------------------------+
 
igrok2008 >> :


私は具体的に記事に書きました。この関数isCloseLastPosByTake()は、コードの一番最後、START FUNCTIONの前に 置かなければなりません!

そして、どこに置いたのですか?

そして、売買の条件では、中括弧にもっと注意を払うことです。明らかに欠けています(チェック - 開いている括弧の数と閉じている括弧の数が等しいかどうか)。ここでセールを修正しました。

    //  ----- Открытие позиции Sell продажа------------  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {
     if( CheckOrders(OP_BUY))                                     {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;        else         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;        else         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
 

ごきげんよう!!!


助けてくれ!控えめでなくて申し訳ないです。

しかし、私の問題は、マーチンに基づくEAがあり、それは最初の注文をSELLまたはBUY、私が望むものを置きますが、私はEAプロパティでBUYまたはSELLを選択できるようにしたいのです。例えば、プロパティにBUYと入力すると、BUYのみの注文が出たり、その逆の注文が出たりします。

MQL4 、まだプログラミングを学んでいないのが残念です。


アドバイザー本体を添付します。


ご協力いただける方、よろしくお願いします。

 
rid >> :

私は具体的に記事に書きました。この関数isCloseLastPosByTake()は、コードの一番最後、START FUNCTIONの前に 置かなければなりません!

そして、どこに置いたのですか?

そして、売買の条件では、中括弧にもっと注意を払うことです。明らかに欠けています(チェック - 開いている括弧の数と閉じている括弧の数が等しいかどうか)。ここで、販売のための修正:


スタートフィの後に入れたんですね、わかります......。

じゃあ、私が間違っていたんですね、ご指摘ありがとうございます :-))

もし私が正しく理解しているならば、エキスパート初期化関数ブロックの最後の } の後に置くべきでしょうか ???????または start-??????の最後の return(0); の後に置くべきでしょうか ?

お待たせしました!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 
igrok2008 >> :

スタート機能の後に入れたので、よくわかりますが......。

間違えました、ご指摘ありがとうございます :-))

もし、私の理解が正しければ、エキスパート初期化関数ブロックの最後の } の後に置くべきでしょうか?

お待たせしました!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

屋外に設置する必要があります。どの機能の内部でもなく、独立した機能として。

こんな感じ。

int start()
  {
//----
    // Узнаем уровень стопов и спрэд
    int Spread = MarketInfo(Symbol(), MODE_SPREAD);
    int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

    // Рассчитываем значения средних на 0-ом и 1-ом барах
    double MAF_0 = iMA(NULL, 0, MAFP, 0, 1, 1, 0);
    double MAF_1 = iMA(NULL, 0, MAFP, 0, 1, 1, 1);
    double MAS_0 = iMA(NULL, 0, MASP, 0, 1, 1, 0);
    double MAS_1 = iMA(NULL, 0, MASP, 0, 1, 1, 1);
    
    // открытие позиции Buy покупка
    if( MAF_1 < MAS_1 && MAF_0 > MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_SELL, MagicNumber) ==true) {
     if( CheckOrders(OP_SELL))                                      {
       if( StopLoss <= StopLevel+ Spread)
         double SL = 0;        else         SL = Ask - StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         double TP = 0;        else         TP = Ask + TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Buy. Ошибка №", GetLastError()); 
                }
               }
              }
//-------------------Конец покупки -----------------------

    //  ----- Открытие позиции Sell продажа------------  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {
     if( CheckOrders(OP_BUY))                                     {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;        else         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;        else         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
    
//----
   return(0);
  }//+----------КОНЕЦ ФУНКЦИИ СТАРТ -------------------+


//ЖЖЖЖЖЖЖ Другие вызываемые пользовательские функции ЖЖЖЖЖЖ

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия           |
//|  последней позиции по тейку.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) {
                t=OrderCloseTime();
                j= i;
              }} }}}}}

  if (OrderSelect( j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo( sy, MODE_DIGITS);
    if ( dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if ( ocp== otp) return( True);
  }
  return( False);
}


この条件下でExpert Advisorが動作するのか不安です。なぜなら、一番最初のポジションはオープンできないから...。

isCloseLastPosByTake() 関数は、買いまたは売りの条件から削除する必要があります。

そうすれば、アドバイザーが動いてくれる。

 
Rover82 >> :

グッドデイ!!!

しかし、私の問題は、マーチンに基づくEAがあり、それは最初の注文をSELLまたはBUY、私が望むものを置きますが、私はEAプロパティでBUYまたはSELLを選択できるようにしたいのです。例えば、プロパティにBUYと入力すると、BUYのみの注文が出たり、その逆が出たりします。

EA本体を添付します。

回答してくれた皆さん、ありがとうございました。


誰も反応してくれないと思われます。EAはデコンパイル(ハッキング)されており、そのようなファイルはここでは歓迎されません。

 
WinExec("C:\\Program Files\\Opera\\opera.exe http://www.mail.ru",2);
みなさん、こんにちは。これは特定のブラウザでリンクを起動していますが、デフォルトで同じリンクを起動するにはどうしたらよいでしょうか。
 
I.e.デフォルトブラウザ使用時
 
Dimoncheg >> :
I.e.デフォルトブラウザ

ShellExecute、いわば「開く」コマンドです。

 

MQL 4を勉強することにしたのは、今まで見つけたすべてが私の願望に合致していなかったからです。現在は、 、プロの仕事を理解し、自分のアイデアのために改良するために勉強しています。(シンプルで小さな、1ページの)カスタム関数があり、そのコードが添付されています。素人なので、2日たっても 理解できません。この関数は何を結果として返すのか、どのネストした条件がElseなのか?

誰か、私の鈍感さに知識の火種を植え付けてくれませんか?

私が得たものは、これです。

関数 の目的は、このペアにすでに注文があるかどうか、ある場合はその種類を判断することです。

この関数を呼び出した関数は、手順で選択されたオーダーのいずれかが存在することを待ちます スイッチ この関数は、 の注文が2つある場合は "1"、ない場合は "2"、"-1 "を返すべきである。

の場合、サイクルが開始されます。 l_pos_16= 0.いくつかのペアで合計4つの保留中の注文があるとします。 、EAが動作しているペアで2つを含み、それらは最初のものではありません。

しかし、ループの最初の繰り返しで、関数 if(OrderSelect(l_pos_16,SELECT_BY_POS,MODE_TRADES)) は、注文のリストで番号「0」の位置をチェックしますが、そのような位置はなく(番号付けは位置1からと理解しているので)、次の位置に渡ります。 さもなくば から完全に撤退して fCountOrders(int&a_count_0,int&a_count_4,int&a_count_8,int&a_count_12) の値を返す ことで Return(-1)です。

私の理解では、与えられたペア に対して、順序があってもなくても結果は同じはずなので、関数全体としての意味が失われているように思います。

しかし、EAが動作するとき、この関数は呼び出された関数がそれに期待することを定義して与え、得られた結果によって動作します

また、何のために else Return(-1) で動作します。

if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)){

または 同じく if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {。

機能のコード:

int fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12)

a_count_0= 0とする。

a_count_4 = 0とする。

a_count_8 = 0とする。

a_count_12 = 0とする。

gi_252 = 0;

for (int l_pos_16 = 0; l_pos_16 < OrdersTotal(); l_pos_16++){

if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)){

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) { (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N)

switch (OrderType()) case OP_BUY:

a_count_0++;

gi_252 = 1;

g_ticket_268 = OrderTicket();

gs_272 = OrderComment();

g_ord_open_price_256 = OrderOpenPrice()です。

g_ord_stoploss_288 = OrderStopLoss();

g_ord_takeprofit_296 = OrderTakeProfit()です。

が壊れる。

case OP_SELL:

a_count_4++;

gi_252 = -1である。

g_ticket_268 = OrderTicket();

gs_272 = OrderComment();

g_ord_open_price_256 = OrderOpenPrice()です。

g_ord_stoploss_288 = OrderStopLoss();

g_ord_takeprofit_296 = OrderTakeProfit()です。

が壊れる。

case OP_BUYSTOP:

a_count_8++。

が壊れる。

case OP_SELLSTOP:

a_count_12++。

}

}

} else return (-1);

}

(a_count_0 + a_count_4 + a_count_8 + a_count_12) を返す。

/* f-iの通常の実行では,変数 のいずれかに1が返されます。 場合 それ以外では "0 "であり、 はそのうちの1つを示している。

の注文の種類と、この注文の番号が呼び出し側の関数で利用可能です。

コメント、始値、ストップロス、テイクプロフィット */

}

理由: