[ARCHIVE] フォーラムを散らかさないように、どんなルーキーでも質問してください。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 3. - ページ 497

 
sss2019:

この条件でEAを書くにはどうしたらいいか教えてください。

EAが取引を開始する通貨ペアは3つあり、EAは1つのチャートにのみ添付され、他の2つでは単独で動作し、一般的に多通貨で動作します。

2つ目の条件は、いずれかの通貨ペアで価格が一定水準に達すると、取引が開始されます。一度に開くことができるのは1つの案件のみです。

取引終了後、価格が近づけば、Expert Advisorはどのペアでも取引を再開することができます。

静的変数を設定し、この変数の値がfalseである限り、取引を開くことができ、いずれかのペアで注文が開かれるとすぐに、この変数は値trueを取るようにしました。注文が終了し、forループで取引が見つからなくなると、この変数には再びfalseという値が入ります。

また、例えば各ペアで1回だけ取引を行うべきとすれば、それは各ペアが独自の変数を持っていることを意味します。

もっと合理的な解決策はないのでしょうか?


注文に「Magik」などのパラメータがあり、特定のMagikを持つ注文をカウントし、取引を許可または禁止するだけです。
 

注文を正しくクローズする方法と、注文に関する情報を収集する方法を教えてください。

私は以下のアルゴリズムを書きました:私は、オープニングがフラクタルアップよりも低く、クローズがフラクタルアップよりも高いときに買いポジションをオープン し、オープニングがフラクタルダウンよりも高く、クローズが低いときに売りポジションを持ちたい。また、85ポイント不足するか、38キャンドル(コンスタントS)以内に注文が開かれた場合、すべての位置を閉じたい。)クローズされた注文だけで全く何もクローズされないし、一般的に注文の扱い方が間違っているような気がして、間違った操作をしてしまい、間違った方法でクローズしてしまいます))どうか、クローズが滑らないように、正しいクローズの仕方とこのコードのどこに間違いがあるのか教えてほしいです。あるいは、これらの操作がすべて適切に行われている、にゅーの歩き方の例とすることもできます。よろしくお願いします!)


extern int S=38; //ポジションを閉じるローソク足の数
extern int SL=85; //いかなる場合でもポジションを閉じるストップ
extern int HIGH=0; //どのタイムフレームで極値を検索するか (5 or 1 or 0(D1))
extern int l=1; //取引するロットの数
int massorder[30][30]; //OPENロットのデータがある
int numb=1; //配列中のエル太数、これはオタである。オープンロット
int i=0;
int ticket=0;
int x=0;
double down,up=0;
double highH1,lowH1=0;

int start()

{
if(Hour()>x)
{
searchH1();
up=highH1;
down=lowH1;
i++;
}.
//----
if(Open[1]<up && Close[1]>up)//fractal level upより、オープニングでローソクが低く、クローズで低い場合
{
ticket=OrderSend(Symbol(),OP_BUY,l,Bid,5,Bid-SL*Point,NULL);
i=0;
savedata();
}.
if(Open[1]>down && Close[1]<down)// キャンドルが下降フラクタルレベルより、オープンで高く、クローズで低い場合
{
ticket=OrderSend(Symbol(),OP_SELL,l,Ask,5,Ask+SL*Point,NULL);
i=0;
savedata();
}
if(i==S)
{
closeAllticket();
closeAllPos();
}.
i++;
//----
x=Hour();
if(Hour()==23)
x=-1;
return(0);
}.
//+------------------------------------------------------------------------+
void closeAllticket()
{
for(int j=0;j<=numb;j++)
{
OrderClose(massorder[j][0],l,Ask,5);
OrderClose(massorder[j][0],l,Bid,5);
}
numb=0;
}.
void closeAllPos()
{

for(int j=0;j<=OrdersTotal();j++)
{
OrderSelect(j,SELECT_BY_POS);
OrderClose(OrderTicket(),l,Ask,5);
OrderClose(OrderTicket(),l,Bid,5);
}.
}
void searchH1()//function to find fractal
{
if(iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,1) &).&& iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,4) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,5))
highH1=iHigh(Symbol(),PERIOD_H1,3)とする。

if(iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,1) && iHigh(Symbol(),PERIOD_H1,3)<))iHigh(Symbol(),PERIOD_H1,4) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,5))
lowH1=iHigh(Symbol(),PERIOD_H1,3);
return (0;
)です。

}

void savedata() //配列にデータを保存するプログラム
{

OrderSelect(ticket,SELECT_BY_TICKET);
massorder[numb][0]=OrderTicket();
massorder[numb][1]=OrderOpenPrice().Of.Pirates; Massorder[numb][0]=OrderOpenPrice(); Massorder[numb][0]=OrderOpenPrice();
massorder[numb][2]=OrderStopLoss();
massorder[numb][3]=OrderTakeProfit();
if(OrderType()==OP_BUY)
massorder[numb][4]=0;
if(OrderType()==OP_SELL)
massorder[numb][4]=1;
numb++;

}.
 
Qwertee:

注文を正しくクローズする方法と、注文に関する情報を収集する方法を教えてください。

私は以下のアルゴリズムを書きました:私は、オープニングがフラクタルアップよりも低く、クローズがフラクタルアップよりも高いときに買いポジションをオープンし、オープニングがフラクタルダウンよりも高く、クローズが低いときに売りポジションを持ちたいと思います:私はまた、85ポイント不足するか、38キャンドル(コンスタントS)以内に注文を開いた場合、すべての位置を閉じたい。)クローズされた注文だけで全く何もクローズされないし、一般的に注文の扱い方が間違っているような気がして、間違った操作をしてしまい、間違った方法でクローズしてしまいます))どうか、クローズが滑らないように、正しいクローズの仕方とこのコードのどこに間違いがあるのか教えてほしいです。あるいは、これらの操作がすべて適切に行われている、にゅーの歩き方の例とすることもできます。よろしくお願いします!)


グローバル変数で、最初にstopを指定したところ

extern int MagicNumber = 11113;
int cntBuy = 0, cntSell = 0, totalBuy, totalSell;

注文を開始する前に

           totalBuy = CountTradesBuy();
           totalSell = CountTradesSell();

を開くための信号で

if((Open[1]<up) && (Close[1]>up) && (totalBuy < 1) && (totalSell < 1))

if((Open[1]>down) && (Close[1]<down) && (totalBuy < 1) && (totalSell < 1))

EA終了時

int CountTradesBuy() {
   int countBuy = 0;
   for (int tradeBuy = OrdersTotal() - 1; tradeBuy >= 0; tradeBuy--) {
      OrderSelect(tradeBuy, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_BUY) countBuy++;
   }
   return (countBuy);
}

int CountTradesSell() {
   int countSell = 0;
   for (int tradeSell = OrdersTotal() - 1; tradeSell >= 0; tradeSell--) {
      OrderSelect(tradeSell, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_SELL) countSell++;
   }
   return (countSell);
}

わすれものなし

 
belck:


をグローバル変数で指定します。

注文が始まる前に

を開くための信号で

EA終了時

ものいわぬように



私はあなたが書いたすべてを置くが、なぜかまだ何も変わっていない。結果はそれがあったように、まだ残っている、注文は大量の時間開いたままであり、私はそれらがSバー後に閉じる必要があります、何が問題ですか?

ファイル:
ikdgna.mq4  7 kb
 
Qwertee:


私はあなたが書いたすべてを置くが、まだ何も変わっていない。結果はそれがあったように、今として、注文はまだ多くの時間を開いており、私はそれらがSバーの後に閉じる必要があります、どのような取引?

クローズ注文の呼び出しは、注文を開く前に行う必要があります。 私は、これらをクローズ時に行っています。

世界的に見ても、その前に

#include <stdlib.mqh>


注文を受ける前に、こんな風に言っています。

if ()
   {
    CloseAllBuy();
    }
    
       
   if () 
   {
   CloseAllSell();
   }

или

if ()
   {
    CloseAllBuy();
    CloseAllSell();
     }

そして、EAの最後の最後に、このようなことがありました。

void CloseAllBuy()
{
        int i;
        int Orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(Orders > 0)
        {
                for(i = Orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 60 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера BUY #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

void CloseAllSell()
{
        int i;
        int orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(orders > 0)
        {
                for(i = orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 120 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                   result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера SELL #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

 

専門家に質問ですが、EAにはテストの一定期間の最低ロット数などの基準があるのでしょうか?損失額などの割合は?

私は2つのEAを持っているだけですが、そのEAは1年に100回トレードを行い、もう1つは全部で30回トレードを行います。(それぞれタイムフレーム15、30)。収益性は良いですが、最初のものは、実際の引用符でデモにある、それは今テストされている...しかし、より良いものがある場合、誰かが私を伝えることができます...。でも、MT4より良いテストがあれば、誰か教えてくれるかも?

 
条件実行の方法を教えてください。1.2550になったらすぐに今の値段で買い注文を出すという条件になっています。つまり、価格が1.2550より高いか等しいときに注文が出され、注文が出されると、静的変数は 注文が0になるまで、新しい注文の開始をブロックします。したがって、注文が閉じられ、このマジックを持つ注文がなくなるとすぐに、開始禁止が解除されて新しい注文が出されますが、価格はとっくにこの水準から遠ざかっているのです。価格がこのレベルに達したとき、Expert Advisorが、保留中の注文ではなく、成行注文を開く必要があります。
 

目利きの皆さん、こんにちは))))

最後の2つのフラクタルにトレンドラインを引くインジケータがありますが、「未確定フラクタル」の後に引く、つまり、フラクタル後にまだ2本目のバーが形成されていないのに、すでにラインが引かれているのです。2本目のバーの後に描画し、1本目のバーの後には描画しないようにするにはどうしたらよいでしょうか。インジケーターはタブの中にあります。

ファイル:
 
rigc:

目利きの皆さん、こんにちは))))

最後の2つのフラクタルにトレンドラインを引くインジケータがありますが、「未確定フラクタル」の後に引く、つまり、フラクタル後にまだ2本目のバーが形成されていないのに、すでにラインが引かれているのです。2本目のバーの後に描画し、1本目のバーの後には描画しないようにするにはどうしたらよいでしょうか。インジケーターはタブの中にあります。


トライ
ファイル:
 
Figar0:

トライ
ぜんぜん描いてない)