MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 306

 
Alexey Viktorov:

そして、それ以外にはありえないのです。1970年以下の年を知っているコンピュータはない。ブローカーの見積書に表示されている年号から始めます。

なるほど)ありがとうございます。
 
Aleksey Vyazmikin:

MT5でのコード

結果


SZZY: コードを変更しました。

その考えはすぐには理解できませんでした。mql5ではやったことがないので、考えてみます。しかし、mql4では以下の方法で行うことができます。

さらに2つのバッファを作成します。

N本のバーのオフセットを設定し、このN本のバーをメインバッファの最後の値で埋めます。

そしてもちろん、これらの追加バッファのインデックスN+1は空の値で満たされます。

 
Alexey Viktorov:

その考えはすぐには理解できませんでした。mql5ではやってないので、考えないといけませんね。しかし、mql4では次のような方法で行うことができます。

さらに2つのバッファを作成します。

それらにN本のバーのオフセットを設定し、このN本のバーをメインバッファの最後の値で埋めます。

そしてもちろん、これらの追加バッファのインデックスN+1は空の値で満たされます。


アイデアありがとうございます。もともとMT5でそうしていたのですが、その後最適化しました。

とにかく、午前4時に寝てしまいましたが(もちろん公開コードは完全ではありません)、2つのバッファで私が望んだことを行いました。

問題は、MT5では充填が左から右に、MT4ではその逆であることでした。ArraySetAsSeries 関数は役に立たず、実際、すべてのロジックを書き直しました。

 

アルテムさん、こんにちは。

TrExp_Nik ver.の手直しについてお願いしたいのですが。Breakevenに移行させる可能性を追加したいのですが、私の限られたプログラミングスキルでは不可能です。e-MovingInWLのコードを私のEAに統合することにしましたが、変数を正しく組み合わせることができませんし、2番目のBreakeven Expert Advisorのコードを正しく理解していません。おそらく、これは最適なバリエーションではないでしょう。どうすればもっと良くなるか、もっと簡単にできるか、アドバイスをお願いしたい。

ファイル:
 
niktach:

アルテムさん、こんにちは。

TrExp_Nik ver.の手直しについてお願いしたいのですが。Breakevenに移行させる可能性を追加したいのですが、私の限られたプログラミングスキルでは不可能です。e-MovingInWLのコードを私のEAに統合することにしましたが、変数を正しく組み合わせることができませんし、2番目のBreakeven Expert Advisorのコードを正しく理解していません。おそらく、これは最適なバリエーションではないでしょう。改善や簡略化について、アドバイスをお願いしたいです。

ごきげんよう。具体的にはどのようなことに挑戦されたのでしょうか?添付のコードは2つだけですね。何でもやってくれる人が必要なら、それこそフリーランスが いい。

そして、自分でやろうとしているのなら、どこがどうわからないのか、具体的に示してください。

 

こんにちは。

チャート上に配置された "triangle "グラフィックオブジェクトのプロパティをプログラムで取得する方法はありますか?プロパティフォームをインタラクティブに開いたときに「パラメータ」タブに表示される、頂点の時間座標と価格座標のことです。ObjectGetInteger 関数やObjectGetDouble関数を使ってみましたが、1つの頂点のデータしか取得することができません。

ありがとうございます。

 
oddball:

こんにちは。

チャート上に配置された "triangle "グラフィックオブジェクトのプロパティをプログラムで取得する方法はありますか?プロパティフォームをインタラクティブに開いたときに「パラメータ」タブに表示される、頂点の時間座標と価格座標のことです。ObjectGetInteger関数やObjectGetDouble関数を使ってみましたが、1つの頂点のデータしか取得することができません。

ありがとうございます。

はい、できます。そして、その思考の方向性は正しいのです。どのようにパラメータを取得しようとしたのか、教えてください。

 
Artyom Trishkin:

チケットで注文を選択する場合、pool を 指定する必要はありません - MODE_TRADES はここでは冗長です - チケットで選択する場合、このパラメータは無視され、注文は2つのリストのうちの1つから選択されます - クローズドリストまたはマーケットポジションのリストから - それはポジションが まだクローズ されていないかどうかによって決まります。

チケットに基づく注文の選択が成功した後、注文が2つのリストのどちらから選択されたかを理解するために、ポジションの終了時間を確認する必要があります - それがゼロより大きい場合、注文はすでに閉じられ、履歴注文のリストから選択されました、それ以外の場合 - 注文はまだ市場にあります。

この行には基本的にエラーはありません(関数の戻り値をチェックしていないこと、この場合無視される修飾子を使用していること、閉じ括弧の後に ";" がないことを除けば)。


ご返信ありがとうございました。

これが関数全体です。ポイントは、注文をオープンし、修正によって一定のストップロスとテイクプロフィットの値を追加していることです。

注文は出ているがストップロスやテイクプロフィットが設定されていない(赤字の計算関数で、OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)でエラー(( )が出る

//オープンオーダー機能、変数:シンボル、オーダータイプ、ロット、オープン価格、TPとSLの計算方法(0 - 価格に設定、1 - オープン価格から計算すべきポイントに設定)、ストップロス、テイクプロフィット)。

/Symbol/Pair、オープンオーダーの種類 - 保留、オープン価格、switch = 1、SL B TP - ストップロスとテイクプロフィットの値は一定です!

bool SendOrder(string Symb,int Type,double OP,int Mode) {
色 CL;
double Pp = MarketInfo(Symb, MODE_POINT);
if (Type==0) CL=Blue;
if (Type==1) CL=Red;
if (Type==2 || Type==4) CL=DarkTurquoise;
if (Type==3 || Type==5) CL=Orange;
//Verview Volume
if(MarketInfo(Symb,MODE_LOTSTEP)==0.01) DG=2; else DG=1;
if (Lot<MarketInfo(Symb,MODE_MINLOT))Lot=MarketInfo(Symb,MODE_MINLOT);
if (Lot>MarketInfo(Symb,MODE_MAXLOT))Lot=MarketInfo(Symb,MODE_MAXLOT);
if (Lot*MarketInfo(Symb,MODE_MARGINREQUIRED)>AccountEquity()){
PnC(StringConcatenate("Not enough money to open trade",Type,")。",DoubleToStr(Lot,DG)),0);
return;
}
// 保留注文のチェック
/*
double Slv = MarketInfo(Symb,MODE_STOPLEVEL)*Pp;
if (Type>1) {
if (Type==2 && MarketInfo(Symb,MODE_ASK)-OP<Slv) OP=MarketInfo(Symb,MODE_ASK)-Slv.JP.JP.JP.JP.JP.JP.JP.JP.JP.JP.JP.JP.JP.JP;
if (Type==3 && OP-MarketInfo(Symb,MODE_BID)<Slv) OP=MarketInfo(Symb,MODE_BID)+Slv;
if (Type==4 && OP-MarketInfo(Symb,MODE_ASK)<Slv) OP=MarketInfo(Symb,MODE_ASK)+Slv;
if (Type==5 && MarketInfo(Symb,MODE_BID)-OP<Slv) OP=MarketInfo(Symb,MODE_BID)-Slv;
。}
*/
RefreshRates();
int Min_Dist = MarketInfo(Symb,MODE_STOPLEVEL); //ストップロス/ステークプロフィットレベルをポイントで制限。最小距離
double Tek_Ask = MarketInfo(Symb,MODE_ASK); //最後に受け取った売値。現在のシンボルの定義済み変数Askに格納されます
double Tek_Bid = MarketInfo(Symb,MODE_BID); //最後に受信した入札価格です。これは、現在のシンボルの定義済み変数 Bid に格納されます
double Tek_Point = MarketInfo(Symb,MODE_POINT); //クォート通貨でのポイントサイズです。現在のシンボルの定義済み変数Pointに格納されます
int Tek_Digits = MarketInfo(Symb,MODE_DIGITS);// シンボル価格の小数点以下の桁数です。これは、定義済みの変数 Digits に格納されます

double Slv = NormalizeDouble(Min_Dist*Tek_Point,Tek_Digits);
if (Type>1) {
if (Type==2 && Tek_Ask - OP < Slv) OP = Tek_Ask - Slv;
if (Type==3 && OP - Tek_Bid < Slv) OP = Tek_Bid + Slv;
if (Type==4 && OP - Tek_Ask < Slv) OP = Tek_Ask + Slv
if (Type==5 && Tek_Bid - OP < Slv) OP = Tek_Bid - Slv;
}
// ストップチェック
if (SL!=0 || TP!=0) {
if (Mode==0) {
if (MathAbs(OP-SL)<Slv && SL!=0) {
if (Type==0 || Type==2 || Type==4) SL=OP-Slv; else SL=OP+Slv;
}
if (MathAbs(OP-TP)<Slv && TP!=0) {
if (Type==0 || Type==2 || Type==4) TP=OP+Slv; else TP=OP-Slv;
}
}else{
if (SL*Pp<Slv && SL!=0) SL=Slv/Pp;
if (TP*Pp<Slv && TP!=0) TP=Slv/Pp;
}
}
// オクトーバー
for(int k=0;k<=TryToTrade;k++) {
if (Type==0) OP=MarketInfo(Symb,MODE_ASK);
if (Type==1) OP=MarketInfo(Symb,MODE_BID);
PnC(StringConcatenate("Trying to open order, type.OBJ)"); if (Type==2) OP=MarketInfo(Symb,MODE_ASK); (Type==3) OP="注文を開こうとしています。",Type," volume: ",Lot," price: ",OP),0);
if (IsTradeAllowed()){
int Ticket=OrderSend(Symb,Type,Lot,NormalizeDouble(OP,MarketInfo(Symb,MODE_DIGITS)),3,0,0,NULL,Tek_Magic,0,CL);
}else{ PnC(StringConcatenate("Cannot open order ",k),0;)).Sleep(3000); continue; }
if (Ticket >= 0) { PnC(StringConcatenate("Order opened ",Ticket),0); break; }
LastError=Fun_Error(GetLastError());
if (LastError==0) { (LastErrorが0の場合。
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
if (LastError==1) return(false);
if (LastError==2) { Work=false;return(false); }
}
// ストップの設定
OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES);
if (SL==0 && TP==0) return;
if (Mode==1) {
if (SL!=0) {
if (Type==0 || Type==2 || Type==4) SL=OrderOpenPrice()-SL*Pp;
if (Type==1 || Type==3 || Type==5) SL=OrderOpenPrice()+SL*Pp;
}
if (TP!)=0) {
if (Type==0 || Type==2 || Type==4) TP=OrderOpenPrice()+TP*Pp;
if (Type==1 || Type==3 || Type==5) TP=OrderOpenPrice()-TP*Pp;
。}
}

for(k=0;k<=TryToTrade;k++) {
PnC(StringConcatenate("Trying to set stops on the order."):",Ticket," s/l: ",SL," t/p: ",TP),0);
if (IsTradeAllowed()の場合。){
//TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(Symb,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE);
。TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(SL,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE)
}else{ PnC(StringConcatenate("Cannot modify order ",k),0);Sleep(3000); continue; }
if (TickeT == true) { PnC(StringConcatenate("Order Modified ",Ticket),0);break; }
LastError=Fun_Error(GetLastError());
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
if (LastError==1) return(false);
if (LastError==2) { Work=false; return(false); }
}
return(true)。

}

 

注文を修正するときにエラー131"間違ったボリューム"が出るのはなぜか、誰か説明してください。

保留は正常に開き、ロットは正規化され、印刷に出力すると最小ロットは0.01で、これは私の数量(デモ口座)より少なくない。

フォーラムをすべて読み直しましたが、問題は見つかりませんでした

裏側で何が起こっているのか、何が描かれていないのか、今も気になるところです。
 
forexman77:

注文を修正するときにエラー131"間違ったボリューム"が出るのはなぜか、誰か説明してください。

保留は正常に開き、ロットは正規化され、印刷に出力すると最小ロットは0.01で、これは私の数量(デモ口座)より少なくない。

フォーラムをすべて読み直したのですが、問題が見つかりませんでした。

ただ、記述されていない隠れたバグが出現して驚くこともなくはない。

他の証券会社で試してみたが、気持ちは変わらなかった。問題は、電話するときの理由です。

double MinLot = MarketInfo(Symbol(),MODE_MINLOT);
double MaxLot = MarketInfo(Symbol(),MODE_MAXLOT);
Alert("MinLot=",MinLot,"MaxLot=",MaxLot);  

は0.01を差し引き、ボットは131をプリントする?