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

 

親愛なるプログラマー、あなたは私が一度に複数の取引のシリーズ(シリーズは、順序が損失またはゼロで閉じて、同じ楽器で次の取引を開く場合ですが、より大きなロットで)、つまり、取引の1シリーズを開いた場合、第二以降の禁止の下に他の楽器に置かれる禁止を設定するのに役立ちます(ボットは同時に異なる楽器に動作します)。ターミナルでグローバル変数 を使ってやればいいと思うのですが、MQLを 学び始めたばかりで、知識も経験も十分ではありません。これは、バイナリーオプションアドバイザーです。以下はそのコードです。

extern double Lots = 1; // ロット数

extern int Exp = 1; // 有効期限

extern int Wait = 1; // 一方向のローソク足の本数

extern int Timeout = 1; // 時間間隔

extern double Multiplier = 3; // 乗算器

extern int Slippage = 5; // スリッページ

extern int Magic = 2090; // マジック


int ticket、Type;

ダブルプライス、ロット

//+------------------------------------------------------------------+

//| 専門家による初期化機能

//+------------------------------------------------------------------+

int OnInit()

{

return(INIT_SUCCEEDED);

}

//+------------------------------------------------------------------+

//| 専門家による初期化関数

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

}

//+------------------------------------------------------------------+

//| エキスパートティック機能

//+------------------------------------------------------------------+

void OnTick()

{

// --------------- オープン・トレード --------------

if (OrdersTotal() == 0) // 注文数はゼロでなければなりません。

{

if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))

// 最後の取引が負けた場合、同じ取引が開始されますが、ロットは大きくなります。

{

Type = TypeLastHistOrder();

if (Type == OP_BUY) Price = Ask;

if (Type == OP_SELL) Price = Bid;

Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2)です。

ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)

// 最後の取引の利益がゼロに等しい場合、同じ取引が開始されます。

{

Type = TypeLastHistOrder();

if (Type == OP_BUY) Price = Ask;

if (Type == OP_SELL) Price = Bid;

Lot = NormalizeDouble(LotsLastHistOrder(), 2);

ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))

|| CountHistTrades() == 0)// 最後の取引が利益を生んだ場合、注文が開かれます。

{

if (SignalBuy() && OrdersTotal() == 0)

{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic)です。

}

if (SignalSell() && OrdersTotal() == 0)

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic)です。

コメント("PriceCloseLastHistOrder(OP_BUY)=", PriceCloseLastHistOrder(OP_BUY), "PriceCloseLastHistOrder(OP_SELL)=",

PriceCloseLastHistOrder(OP_SELL) );

}

}

}

}

//+------------------------------------------------------------------+

int CountTrades(int type = -1) // 取引回数の決定

{

int cnt = 0;

for (int i=OrdersTotal()-1; i>=0; i--) // ループは、絶対にすべてのオープンオーダーを通過し、iはオーダー番号です。

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // 注文番号iの注文が市場にあるかどうかをチェックします。

// ある場合は,以下の条件を確認する.

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)) // もし、シンボルの場合。

// 注文がオープンされているシンボルは現在のシンボルと同じであり、注文タイプは現在のEAの設定でマジックと同じであり、そして

// オーダータイプが type と等しい (または type == -1 (オーダーカウントにどのタイプが必要かは重要でない場合))

cnt++; // 変数 cnt に 1 が加算され、ループ終了時に cnt は取引回数と同じになります。

// 現在のEAが特定のタイプの通貨ペアで開いたもの

}

}

return(cnt); // 変数 cnt の値を返す.

}

//+------------------------------------------------------------------+

int CountHistTrades(int type = -1)

{

int cnt = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)))

cnt++です。

}

}

return(cnt);

}

//+------------------------------------------------------------------+

bool SignalBuy()

{

for (int i=1; i<=Wait; i++)

{

if (クローズ[i] > オープン[i]) return(false)

}

if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder() +Timeout))

&& CountHistTrades() > 0) return(true);

if (CountHistTrades() == 0) return(true);

return(false)です。

}

//+------------------------------------------------------------------+

bool SignalSell()

{

for (int i=1; i<=Wait; i++)

{

if (クローズ[i] < オープン[i]) return(false)

}

if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder() +Timeout))

&& CountHistTrades() > 0) return(true);

if (CountHistTrades() == 0) return(true);

return(false)です。

}

//+------------------------------------------------------------------+

datetime TimeLastHistOrder(int type = -1)

{

datetime lasttime = 0;

datetime opentime = 0;


for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)))

{

if (OrderCloseTime() > lasttime)

{

lasttime = OrderCloseTime();

opentime = OrderOpenTime();

}

}

}

}

return(opentime);

}

//+------------------------------------------------------------------+

int TypeLastHistOrder()

{

datetime time = 0;

int type = -1;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

{

if (OrderCloseTime() > time)

{

time = OrderCloseTime();

type = OrderType();

}

}

}

}

return(type)です。

}

//+------------------------------------------------------------------+

double LotsLastHistOrder(int type = -1)

{

datetime time = 0;

ダブルロット = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)))

{

if (OrderOpenTime() > time)

{

time = OrderOpenTime();

time = OrderLots();

}

}

}

}

return(lots)です。

}

//+------------------------------------------------------------------+

double PriceCloseLastHistOrder(int type = -1)

{

datetime time = 0;

二重価格 = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)))

{

if (OrderCloseTime() > time)

{

time = OrderCloseTime();

price = OrderClosePrice()。

}

}

}

}

}

}

//+------------------------------------------------------------------+

double PriceOpenLastHistOrder(int type = -1)

{

datetime time = 0;

二重価格 = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)))

{

if (OrderCloseTime() > time)

{

time = OrderCloseTime();

price = OrderOpenPrice();

}

}

}

}

}

}

//+------------------------------------------------------------------+

 
こんにちは、同僚たち!

プログラミング中に質問があります:EAでサーバーの時間を ミリ秒単位で正確に 取得する方法はありますか?
例えば、ゲット。23.09.2016 14h.53分: 54000ミリ秒?それは、ちょうど54秒、000ミリ秒です。
 
e-partner:
同僚の皆さん、こんにちは。

プログラミング中に質問があります。Expert Advisorでサーバーの時間を ミリ秒の精度で 取得することは可能でしょうか?
例えば、ゲット。23.09.2016 14h.53分: 54000ミリ秒?それは、ちょうど54秒、000ミリ秒です。

面白い質問ですね。 最後に判明したサーバーの時刻、TimeCurrent()、またはサーバーの現在時刻 とはどういう意味ですか?

もしTimeCurrent()であれば、新しい引用符を含むパケットがサーバーから端末までインターネットを通過する時間は10-500msで、この時間はパケットごとに異なると考えた場合、どのように使うのでしょうか?その上、最後の引用文が複数のソース、流動性プロバイダーからサーバーに来る場合、それが処理され、その後、サーバーは新しいティックを送信すると、何が到着しているかは明らかではありません。また、サーバーのシステムタイマーがどのように天文時間と同期しているかは不明である。2014.01.09 04:15~06:15 MSK(木曜日、取引日)私は、偏差値が天文学的なものではなく、31社の平均値から、これを発見していたのです。25時点の図は、これらの偏差を示したものである(単位はmsではなく秒)。

また、サーバーからのデータからミリ秒単位で何かを割り出すことに何の意味があるのでしょうか?

2番目の選択肢はより明確です。あなたのコンピューターが、あなたが知っている精度で天文時間に同期していれば、サーバーが稼動している都市の天文時間も同じ精度で知ることができるのです。しかし、なぜそれが必要なのか...。

 

ストラテジーテスターから 最適化がどこに行ってしまったのかがわからない。チェックが全部立っていて、何もわからない。MT4ビルド1010。Windows 8.1です。

最適化を有効にする方法を教えてください。

スクリーンショットを添付します。最適化ボタンが表示されない。

ファイル:
desktop.zip  129 kb
 
MT4 b1010でヒストリカルデータのデバッグができない(ボタンやメニュー項目がアクティブでない)のはなぜですか?MT5ではすべてOKです。
 
開発者がそれを禁じているからです。
 
int Magik。
int Slippage = 5,stopL1 = 50,takeP1 = 20;
int trend,TicketS,TicketB。
ダブルrsi,TP,SL。
//+------------------------------------------------------------------+
//| 専門家による初期化機能
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits == 3 || Digits == 5)
{
スリッページ *= 10;
stopL1 *= 10;
{ takeP1 *= 10;
}

return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 専門家による初期化関数
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| エキスパートティック機能
//+------------------------------------------------------------------+
void OnTick()
{
double priseBuy = FindLastOrderPrise (OP_BUY);
double priseSel = FindLastOrderPrise (OP_SELL);
double frezeelevl = MarketInfo(OrderSymbol(),MODE_FREEZELEVEL);
rsi = iRSI(Symbol(),PERIOD_D1,7,PRICE_CLOSE,0)。
trend = WhatTrend()。
if (CountTrades() == 0)
{
if(trend == 1 && rsi <=30)
{
if(OrderSend(Symbol(),OP_BUYLIMIT,0.10,Ask,Slippage,0,0, "first buy order set",Magik,0)== true)とする。
{
TicketB = FindLastTicket(OP_BUY)。
if(TicketB >0)
{
SL = priseBuy + NormalizeDouble(takeP1 * Point,Digits)です。
TP = priseBuy - NormalizeDouble(stopL1 * Point,Digits);
if(OrderModify(TicketB,priseBuy,SL,TP,0)== true)
Comment("hooraaaaaah");
}

}
}// if(trend == 1 && rsi <= 30)
else if(trend == 2 && rsi >= 70)
{
if(OrderSend(Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0, "first order set",Magik,0)== true)とする。
{
for(int i = OrdersTotal()-1;i >0;i--)
{
OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES);
if (OrderType()== OP_SELL && OrderMagicNumber() == Magik)
{
double sl = OrderOpenPrice() + NormalizeDouble(stopL1 * Point,Digits);
double tp = OrderOpenPrice() - NormalizeDouble(takeP1 * Point,Digits);
if(OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)==true)break。
でなければ続ける。
}
}
}
}
}// (CountTrades() == 0)

}

私は有能なプログラマに私の間違いが何であるかを説明するように求めている!なぜ順序が修正されないのか!そして、コンパイラはそうしている間エラーを出さない

 
チュートリアルを読み、メモを取りながら勉強しました。具体的にエラーを指摘してください。
 
burbur87:
チュートリアルを勉強しました。読んでメモを取りました。具体的にエラーを指摘してください。コンパイラはエラーを出さず、テスターでもエラーはありません。しかし、順序は修正されていません。順序はプログラムでは全く見られないようです。

OrderSend() が返すものをよく読んでください

 if(OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0) > 0)

実は、私なら次のようにします。

   int ticket=OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0);
   if(ticket>=0)
      {
        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
          {
            if (OrderStopLoss()==0 || OrderTakeProfit()==0)
             {
               double sl = OrderOpenPrice() + NormalizeDouble(stopL1 * Point,Digits);
               double tp = OrderOpenPrice() - NormalizeDouble(takeP1 * Point,Digits);
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)) Print("Error ",GetLastError()," modify order ",ticket);
             }
          }
      }
 
Sepulca:

OrderSend() が返すものをよく読んでください

if(ticket>=0)

実際、私ならこうします。

チケットは0枚でもいいのですか?