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

 
 int x=0;
 int scale_mas[13]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096};//объявление массива

 for(int i=0;i < ArraySize(scale_mas);i++){
    if(x == scale_mas[0])x = scale_mas[1];                       //если х=индекс0, то х=индекс1
    if(x >= ArraySize(scale_mas))x = scale_mas[11];              //если х>= размер массива, то х=индекс11
    i=x;
    if(ObjectGetInteger(0, "Button+", OBJPROP_STATE) == false){  //если кнопка "+" нажата
       i=i+1;                                                    //увеличиваем индекс на 1
       ObjectSetInteger(0, "Button+", OBJPROP_STATE,true);}
                        
    x=i;							 //присваиваем х значение последнего индекса
    if(ObjectGetInteger(0, "Button-", OBJPROP_STATE) == false){  //если кнопка "-" нажата
       i=i-1;                                                    //уменьшаем индекс на 1
    ObjectSetInteger(0, "Button-", OBJPROP_STATE,true);}
                            
    x=i;                                                         //присваиваем х значение последнего индекса
 ObjectSetString(0,"=TrendLine",OBJPROP_TEXT,scale_mas[x]);}}    //выводим результат scale_mas[x]
昨日、コードを書いたところ、その通りに動いているように見えますが、プラスボタンで配列の一番上の値まで行ったときだけ、配列の先頭にリセットされ、また配列の上に移動してしまいます。配列の一番上の値に達したときに、さらにプラスボタンをクリックしても、一番上のインデックスで止まり、配列の一番下にリセットされないようにするには、コードに何を追加または修正すればよいでしょうか。あるいは、このボタンをクリックするアイデアを実装するために、何か他の方法でコードを簡略化することは可能でしょうか?
 
Ivan Revedzhuk:
昨日、コードを書いたところ、その通りに動いているように見えますが、プラスボタンで配列の一番上の値まで行ったときだけ、配列の先頭にリセットされ、また配列の上に移動してしまいます。配列の一番上の値に達したときに、さらにプラスボタンをクリックしても、一番上のインデックスで止まり、配列の一番下にリセットされないようにするには、コードに何を追加または修正すればよいでしょうか。あるいは、このボタンをクリックするアイデアを実装するために、何か他の方法でコードを簡略化することは可能でしょうか?
if(x >= ArraySize(scale_mas))
 ArraySize(scale_mas)-1;              //если х>= размер массива, то ....

おそらくそうでしょう。

 
Alexey Viktorov:

そうですね。

それも試してみましたが、同じように動作します

 
Ivan Revedzhuk:

それも試してみましたが、同じように動作します

すぐには気がつかなかった、何のためのサイクルなのか?

 
Alexey Viktorov:

すぐには気がつかなかったのですが、何のためのループなのでしょうか?

それがなくてもできる方法はないのでしょうか?ただ、何がベストかわからず、論理的に考えたことをやっているだけなんです。

 
Ivan Revedzhuk:

それがなくてもできる方法はないのでしょうか?ただ、何がベストかわからず、論理的だと思うことをやっているだけなんです。

まあ、理屈は違うんでしょうけど。ボタン+を押すと、配列のインデックスが 増加します。最大値に達すると、増加せず、最大値のままです。ボタンを押す-インデックスが減少した。0になった、押しても反応しない、インデックス0のまま。

それとも何か別の案があったのでしょうか?

PS;また、この質問に対して、フラグを使った作業例を投稿し、それを削除したのは誰でしょうか?なぜ削除したのですか?何しろ、男には本当にいい解決策なのだ。なぜ、限定配列が必要なんだ?
 
Alexey Viktorov:

まあ、理屈は違うんでしょうけど。ボタン+を押すと、配列のインデックスが 増加します。最大値に達すると、増加せず、最大値のままです。ボタンを押す-インデックスが減少した。0に到達、応答せず、インデックス0のまま。

それとも何か別の案があったのでしょうか?

PS;また、この質問に対して、フラグを使った作業例を投稿し、それを削除したのは誰でしょうか?なぜ削除したのですか?何しろ、男には本当にいい解決策なのだ。なぜ、限定配列が必要なんだ?

いや、まさにその通りだった。ちゃんとしたやり方がよくわからないので、もらったやり方でやりました。しかし、プログラム内でループが実行されているとき、チャート上のボタンをクリックしない限り、他のすべてが動作しないことに気がつきました。すべてが一時停止しているような感じです。なぜこうなるのか理解できません。もし、他の方法でアイデアを実装する亜種があれば、ありがたいのですが...。

 

それだけです。問題が解決される)配列などを使わずにもっとシンプルになった))))

2つ目の質問が出た。マウスでコンテキストメニューからAlertを設定すると表示される矢印で、Alertの トリガーレベルをコードで設定するにはどうすればよいですか?

注意喚起に関する質問

 

助けてください、plz、このEAに機能を追加することは可能ですか、ウィンドウEURUSDで設定したEAが、同じパラメータで、同時に、GBPUSDの取引を開くように、EURUSDは開きません。

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

//|開発者です。ミナエフ・アンドレイ|

//| Expert Advisor: Stochastic.mq4|

| ウェブサイト:Safe-Forex.| ウェブサイト:Safe-Forex.|

//| メールminaev.work@mail.ru|

//| Skype: live:minaev.作業|

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

#property copyright "Safe-Forex.ru"(セーフフォレックス・ルー)。

#プロパティリンク "https://safe-forex.ru"

#プロパティの厳密さ


extern bool Use_Symbol1 = true;

extern string Symbol1 = "USDJPY";


入力文字列 settings = ""; // Expert Advisorの設定

入力 int magic = 111; // 入力 magic

input double fixVolume = 0.01; // ボリューム

input int takeProfit = 500; // 利益を得る。

入力 int stopLoss = 500; //損失

入力 int buyLevel = 100; // 入力 int buy Level

input int sellLevel = 0; // 75 売りレベル


extern int ADXperiod = 15; //ADX期間 15

extern int ADXLevel =1;


extern int MAperiod =360; //MA期間 80

extern int MAperiod_2 =360; //MA周期80



input string stochSettings = ""; // Stochastic Oscillatorインジケーターの設定

入力 int stochPeriodK = 5; //期間 %K

入力 int stochPeriodD = 3; //期間 %D

input int stochSlowing = 3; // スローイング中

input ENUM_STO_PRICE stochPrice = STO_LOWHIGH; // 価格

input ENUM_MA_METHOD stochMethod = MODE_SMA; // メソッド


datetime newCandle; // 現在のチャート上の新しいローソク足

bool allowOpenBuy; // 買いポジションを開くことを許可する。

allowOpenSell; // 売りのポジションを開く許可

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

int OnInit(void)

{

return INIT_SUCCEED;

}

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

void OnDeinit(const int reason)

{

}

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

void OnTick(void)

{

if(newCandle!=Time[0]) CheckSignalExist(); newCandle=Time[0];

if(allowOpenBuy) OpenPosition(OP_BUY);

if(allowOpenSell) OpenPosition(OP_SELL);

}

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

//| 現在の価格でポジションをオープンする関数|

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

void OpenPosition(int type)

{


倍価格=0.

if(type==OP_BUY) price=Ask;

if(type==OP_SELL) price=Bid;

int ticket=OrderSend(_Symbol,type,fixVolume,price,0,0,",magic,0);

// int ticket=OrderSend(,type,fixVolume,price,0,0,0,",magic,0);

Sleep(1000)です。

if(チケット>0)

{

if(type==OP_BUY)

{

Print("買いポジションがオープンしました、チケット:",チケット);

allowOpenBuy=false。

// SetStopOrders(ticket)を設定します。

}

if(type==OP_SELL)の場合

{

Print("Sell position opened, ticket: ",ticket);

allowOpenSell=false。

// SetStopOrders(ticket)を設定します。

}

}

if(チケット<0)

{

if(type==OP_BUY) Print("買いポジションが開きませんでした、エラー: ",GetLastError()));

if(type==OP_SELL) Print("Sell position didn't open, error: ",GetLastError());

}

}

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

//| ストップオーダーを設定する機能|

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

//void SetStopOrders(int ticket)

//{

// double stopLevel=MarketInfo(_Symbol,MODE_STOPLEVEL),

// スプレッド =MarketInfo(_Symbol,MODE_SPREAD),

// tp =takeProfit,

// sl =stopLoss。

// stopLevel+=spread;

// if(tp<stopLevel)

// {

// tp=stopLevel;

// Print("利益セットの最小距離");

// }

// if(sl<stopLevel)

// {

// sl=stopLevel;

// Print("損失集合の最小距離");

// }

// if(OrderSelect(ticket,SELECT_BY_TICKET))

// {

// int type=OrderType();

// double opp =OrderOpenPrice();

// if(type==OP_BUY) {tp=opp+tp*_Point; sl=opp-sl*_Point;}.

// if(type==OP_SELL) {tp=topp-tp*_Point; sl=opp+sl*_Point;}.

// if(OrderModify(ticket,opp,sl,tp,0))を実行します。

// {

// if(type==OP_BUY) Print("P&L levels set for Buy position, ticket: ",ticket).If(type=OP_BUY).Print("P&Lレベルセット")。

// if(type==OP_SELL) Print("P&L levels for Sell position has been set, ticket: ",ticket);

// }

// else {

// if(type==OP_BUY) Print("P&L levels for Buy position has not been set, ticket: ",ticket," error: ",GetLastError()");

// if(type==OP_SELL) Print("P&L levels for Sell position is not been set; ticket: ",ticket," error: ",GetLastError();

// }

// }

//}

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

//| シグナルがあるかどうかをチェックする関数|

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

void CheckSignalExist(void)


{

double ADX1=iADX(Symbol(),Period(),ADXperiod,0,MODE_MAIN,1); //////////////////////////////////////////////

double ADX2=iADX(Symbol(),Period(),ADXperiod,0,MODE_MAIN,2);

double DPLUS=iADX(Symbol(),Period(),ADXperiod,0,MODE_PLUSDI,1);

double DMINUS=iADX(Symbol(),Period(),ADXperiod,0,MODE_MINUSDI,1);

double MA=iMA(Symbol(),Period(),MAperiod,0,MODE_SMA,0,1);

double MA_2=iMA(Symbol(),Period(),MAperiod_2,0,MODE_SMA,0,1);


//PERIOD_H1

double mainLine1=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_MAIN,1),

mainLine2=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_MAIN,2).SymbolとstochPeriodKの組み合わせの場合。

signLine1=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_SIGNAL,1).SymbolとstochPeriodKは、ストキャスティックスと呼ばれます。

signLine2=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_SIGNAL,2).SymbolとstochPeriodKは、ストキャスティックスとストキャスティックスとで構成されています。

Comment(" ", (Ask-Bid)/1.5," ",Bid-Close[1]," ", Ask-Close[1])。

// if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel)

//& iClose(Symbol(),Period(),1)>MA& iClose(Symbol(),Period(),1)>MA_2 && signLine1<buyLevel && signLine2<buyLevel

if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel)

//&Close[2]<MA& Close[2]<MA_2 && signLine1<buyLevel && signLine2<buyLevel

&&Close[10] > Close[1]-(Close[1]-Close[20])となります。

&& Close[10]>Bid )

{

Print("買いポジションを開くシグナルが表示されました");

if(GetPositionsNumber()==0)です。

{

// allowOpenSell=trueとする。

{allowOpenBuy=trueとした。

Sleep(1000)です。

Print("Allowed to open Buy position");

}

}

// if(mainLine1<signLine1 && mainLine2>signLine2 && mainLine1>sellLevel && ADX1>ADXLevel&& mainLine2>sellLevel)

//& iClose(Symbol(),Period(),1)<MA& iClose(Symbol(),Period(),1)<MA_2 && signLine1>sellLevel && signLine2>sellLevel

if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel)

//&Close[2]>MA& Close[2]>MA_2 && signLine1<buyLevel && signLine2<buyLevel

&&Close[10] < Close[1]+(Close[20]-Close[1])となります。

&& Close[10]<Ask )

{

Print("売りのポジションをオープンするシグナルが表示されました");

if(GetPositionsNumber()==0)です。

{

// allowOpenBuy=trueとする。

allowOpenSell=trueとした。

Sleep(1000)です。

Print("Allowed to open Sell position");

}

}

}


















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

//| この関数は、オープンポジションの数を返します。|

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







int GetPositionsNumber(void)

{

int number=0;

for(int i=0; i<OrdersTotal(); i++)

if(OrderSelect(i,SELECT_BY_POS))

if(OrderSymbol()==_Symbol && OrderMagicNumber()==magic)

number++です。

を返します。

}

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

 
vvs1:

Help, plz, is possible to add a function to this EA, so the EA installed in the EURUSD window would open a trade with same opening parameters, at same time, but on GBPUSD, not open on EURUSD.このEAに機能を追加することは可能でしょうか?

すみません、頭は大丈夫ですか?コードを一箇所に挿入しているだけでなく、大量の空行を残しています。

助けを求める相手に対して敬意を払うべきじゃないのか?