初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 35

 

こんにちは。
インジケーターを修正するには、すべてのドット". "を空白の""に置き換える必要がありました。

ファイル:
supDem.zip  68 kb
 

ごあいさつ

ある注文集計の書き込み機能で、注文の 選択タイプを注文による選択からチケットによる選択に変更しました。

int BuyLimitCount(){
int count=0
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POSMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}  

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

その後、数十本のローソクを走らせると全て正常に動作し、それ以降はログにエラーが繰り返し表示されます。

2016.12.17 17:44:31.609 2016.12.07 00:27 test3 EURUSD,M1: OrderModify 関数の未知のチケット2

2016.12.17 17:44:31.608 2016.12.07 00:25 test3 EURUSD,M1: OrderModify error 4108 // 無効なチケット番号です。

以下は全文です。4つの機能すべてで変更しました。

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0int ticketUP, ticketD;


void OnTick()  
{
double maxpr1=-9999double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}} 

if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1Print("ERROR OP_BUY"); else Print("OP_BUY OK");}

if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1Print("ERROR OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1;
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
OrderModify(ticketD, maxpr1, slS, tpS, 0, Blue);}

if (z!=minpr1){z=minpr1;
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
OrderModify(ticketUP, minpr1, slB, tpB, 0, Red);}

double maxpr=-9999double minpr=9999;

for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}} 

string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max "DoubleToStr(maxpr, 5), ", min "DoubleToStr(minpr, 5),".");
}

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

int BuyCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}return(count);}

int SellLimitCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}return(count);}

int SellCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}return(count);}


そして、ここで一つ瞬間があります。選択機能を変更した後、オーダーモディファイ機能がエラーを発生するようになり、しばらくテスト した後でのみ、最初はすべてが正常でした

なぜそうなるのか、どう対処すればいいのか。


 
spoiltboy:

ごあいさつ

ある注文集計の書き込み機能で、注文 選択の種類を注文選択からチケットによる選択に変更しました。

int BuyLimitCount(){
int count=0
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POSMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}  

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

その後、数十本のローソクを走らせると全て正常に動作し、それ以降はログにエラーが繰り返し表示されます。

2016.12.17 17:44:31.609 2016.12.07 00:27 test3 EURUSD,M1: OrderModify 関数の未知のチケット2

2016.12.17 17:44:31.608 2016.12.07 00:25 test3 EURUSD,M1: OrderModify error 4108 // 無効なチケット番号です。

以下は全文です。4つの機能すべてで変更しました。

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0int ticketUP, ticketD;


void OnTick()  
{
double maxpr1=-9999double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}} 

if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1Print("ERROR OP_BUY"); else Print("OP_BUY OK");}

if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1Print("ERROR OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1;
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
OrderModify(ticketD, maxpr1, slS, tpS, 0, Blue);}

if (z!=minpr1){z=minpr1;
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
OrderModify(ticketUP, minpr1, slB, tpB, 0, Red);}

double maxpr=-9999double minpr=9999;

for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}} 

string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max "DoubleToStr(maxpr, 5), ", min "DoubleToStr(minpr, 5),".");
}

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

int BuyCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}return(count);}

int SellLimitCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}return(count);}

int SellCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}return(count);}


そして、ここで一つ瞬間があります。選択機能を変更した後、オーダーモディファイ機能がエラーを発生するようになり、しばらくテスト した後でのみ、最初はすべてが正常でした

なぜそうなるのか、どう対処すればいいのか。


おそらく、すでにトリガーまたは削除された注文を修正しようとしているため、このエラーが発生します。 保留注文がトリガーされた場合など、保留中の注文チケットが格納されている変数をクリアする必要があります。
 
Sergey Gritsay:
おそらく、すでにトリガーまたは削除された保留中の注文を修正しようとしているため、このエラーが発生します。 保留中の注文がトリガーされた場合など、保留中のチケットが格納されている変数をリセットする必要があります。
正しい方法を知っていますか?どうすればいいのか、まったくわからない。
 

こんにちは、皆さん、何が問題なのか理解するのを助けてください。

Expert Advisorがticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0, "AV2",1111,0,Green) をオープンしました。

МТ4を閉じ、МТ4を開き、EAの前作をチェックする

for(int prev=0; prev<OrdersTotal();prev++) //前回のEA操作のチェック

{

ViborOrdera=OrderSelect(prev,SELECT_BY_POS);

if(OrderSymbol()==Symbol())とする。

//*************************************

//------購買サイクルの確認------------。

if(OrderType()==OP_BUY && OrderMagicNumber()==1111)

{

PriceAsk=OrderOpenPrice();//オープンプライス、EAのさらなる作業に必要

}

の質問ですが、どこがエラーなのか、チェックはないのでしょうか?ループの本体はイニテにある。

 

整理する時間がない......。

適材適所の読み方、置き方を心がけてください。

boolRefreshRates()。

///
 
ed3sss:

こんにちは、皆さん、何が問題なのか理解するのを助けてください。

Expert Advisorがticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0, "AV2",1111,0,Green) をオープンしました。

МТ4を閉じ、МТ4を開き、EAの前作をチェックする


質問、どこがエラーなのか、チェックがないのか?ループの本体はIniteにあります。

そして、ループに入らないループであることを証明する。また、最後の1枚が必要なのに、なぜアカウントの最初から、すべての注文をチェックするのですか?
 
Mikhail Kozhemyako:

整理する時間がない......。

適材適所の読み方、置き方を心がけてください。

boolRefreshRates()。

///
役に立たなかった(
 
Vitalie Postolache:
そして、それが入らないサイクルであることを証明する。それに、最新のものが必要なのに、なぜアカウントの最初からすべての注文をチェックする必要があるのでしょうか?

証明:Print("前のPriceAsk-",PriceAsk);ログは空です。

また、最新の注文が必要な場合、なぜアカウント作成当初からすべての注文をチェックする必要があるのでしょうか?- 10通貨ペアを開いている場合、他にどのような方法がありますか?


 

MQL で ViborOrdera=OrderSelect(prev,SELECT_BY_POS) に変更するまでは全てOKでした。

以前はOrderSelect(prev,SELECT_BY_POS);でした。ずいぶん前のことですが)、効果がありました。