[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 220

 
alsu:
その通りだ。さらに、箱から値を取り出すとdouble型になるが、その結果をint型の変数に書き込むという命令があれば、コンパイラは自動的にその値を新しい箱に入れるために必要なすべての手段を講じる。 。


最後に念のため、最後の段落の私の感想をご確認ください...。そこで、上記のような専門家にお願いしてみましょう。

//--------------------------------------------------------------------
// globalvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int    Experts;                                 // Колич. экспертов
double Depo=10000.0,                            // Заданный депозит
       Persent=30,                              // Заданный процент     
       Money;                                   // Искомые средства
string Quantity="GV_Quantity";                  // Имя GV-переменной
//--------------------------------------------------------------------
int init()                                      // Спец. функция init
  {
   Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.
   Experts=Experts+1;                           // Колич. экспертов
   GlobalVariableSet(Quantity, Experts);        // Новое значение
   Money=Depo*Persent/100/Experts;              // Средства для эксп.
   Alert("Для эксперта в окне ", Symbol()," выделено ",Money);
   return;                                      // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   int New_Experts= GlobalVariableGet(Quantity);// Новое колич. эксп.
   if (Experts!=New_Experts)                    // Если изменилось
     {
      Experts=New_Experts;                      // Теперь текущ. такое
      Money=Depo*Persent/100/Experts;           // Новое знач. средств 
      Alert("Новое значение для эксперта ",Symbol(),": ",Money);
     }
   /*
   ...
   Здесь долен быть указан основной код эксперта,
   в котором используется значение переменной Money
   ...
   */
   return;                                      // Выход из start()
  }
//--------------------------------------------------------------------
int deinit()                                    // Спец. ф-ия deinit
  {
   if (Experts ==1)                             // Если эксперт один..
      GlobalVariableDel(Quantity);              //..удаляем GV-перемен
   else                                         // А иначе..
      GlobalVariableSet(Quantity, Experts-1);   //..уменьшаем на 1
   Alert("Эксперт выгружен из окна ",Symbol()); // Сообщ. о выгрузке
   return;                                      // Выход из deinit()
  }
//--------------------------------------------------------------------

それから、文字列の中。

Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.

GV-variable」というボックスに整数型Expertsの変数を入れて保存しています(double型に変換しています)。そして、もし(仮に)Expert Advisorに文字列があったとして

int New_Experts=Experts;

というのは、int型の変数に結果を書き込むコマンドがあることを意味します。この場合、コンパイラは。

* は、double 型の変数の値を取り出してしまう。

* Experts 変数の値に必要な変更を加えます。

* この値を変数New_Expertsに代入し、...

* 変数 New_Experts の値を "int" ボックスに入れる。

つまり、変数の型は、ある値の外部ラッパー/パッケージでしかないということですね? そして、ダウングレードは数値に対してのみ許可され、文字列は数値に 変換されないので、GV変数は文字列型にはなりえません。

そうだろ?

ご回答をよろしくお願いいたします。

 
Stells:
そうでないもの for (f=1;f<Bars;f++) { Price1 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,f)) / MarketInfo(Symbol_1, MODE_POINT)Price2 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,f)) / MarketInfo(Symbol_2, MODE_POINT); Spread = Price1 - Price2; Print ("Price1=" + Price1, " Price2="+Price2");





if (Spread==0){t=f; break;}.
} Price12 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,t)) / MarketInfo(Symbol_1, MODE_POINT); Price22 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,t)) / MarketInfo(Symbol_2, MODE_POINT); Spread2 = Price12 - Price22; 。





if (MathAbs(Spread2) >= razdvizka && Spread2 < 0) { open trade }.


スプレッドが0になったバーを固定し、そこからスプレッドを制御したい。

if(MathAbs(Spread)<eps) { .........。のように、条件を満たす点が見つかるかどうかという結果を制御する必要があります。IMHOでは、例えば次のように別の関数を作成する方が良いと思います。

int GetBarNumWithZerroDist(string Smbl1, string Smbl2, double K, double eps=0.00001)
{
int i=1;
double Smb1Cl0 = NrmalizeDouble(iClose(Smbl1,0,0));
double Smb2Cl0 = NrmalizeDouble(iClose(Smbl2,0,0));
double Smb1Pnt = MarketInfo(Smbl1, MODE_POINT);
double Smb2Pnt = MarketInfo(Smbl2, MODE_POINT);
int    mBars   = MathMin(iBars(Smbl1), iBars(Smbl2));

    for (i=1;i<mBars;i++) 
    {
        double Price1 =   (Smb1Cl0 - iClose(Symbol_1,0,i)) / Smb1Pnt;
        double Price2 = K*(Smb1Cl0 - iClose(Symbol_2,0,i)) / Smb2Pnt;
        double Spread = Price1 - Price2; 
        //Print ("Price1="+Price1, " Price2="+Price2);
        if(MathAbs(Spread)< eps) return(i);
    }
    return(-1);
}
 

こんにちは

インジケータに、d1などのように常に同じ期間を表示するための#プロパティが あるかどうかご存知ですか?

で、MetaTraderでタイムフレームを切り替えても切り替わらないのでしょうか?

しゃい

------------------------------------------

まあ何人のプロが......。

 

help!!!!

スクリプトからインジケータを呼び出す方法、ウィンドウに表示させる必要があります。

 

こんばんは!EAコードの変更にご協力お願いします。
1.テストではすべてうまくいきますが、取引では最初の取引を手動で開始しなければならず、ストップとテイクも手動です。新しいティックになったら自動的に取引を開始するようにしたいのですが。
2.ストップロスを トリガーした場合、次のポジションは前回のロットの2倍で建てられるので、ロットは理論上無限大に増える可能性がある(私の場合、最大51.2)ので、閾値を変更できるように制限したい(例えば、0.8)です。閾値に達してストップがかかると、EAは切断されず、0.1からやり直されます。

//--- input parameters
extern double    Lot=0.1;
extern int       TP=22;
extern int       SL=20;
extern double    K_Martin=2;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
 {
double oop, ocp, osl, otp, ol; 
int Magic = 0;
int closetime= 0,lastorder=0, tip=0;
for(int i=0;i<OrdersHistoryTotal();i++) /* Цикл перебора ордер*/
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; // Выбираем ордер из истории.
if(OrderMagicNumber()!=Magic) continue;
if(closetime<OrderCloseTime())
{
closetime = OrderCloseTime();
lastorder = OrderTicket();
tip=OrderType();
ol=OrderLots();
}
}
OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY);
ocp= (OrderClosePrice());
oop= (OrderOpenPrice());
osl= (OrderStopLoss());
otp= (OrderTakeProfit());
ol= (OrderLots());
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия ОРДЕРА--[",OrderOpenPrice(),"]"); 
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена закрытия ОРДЕРА--[",OrderClosePrice(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==false )
{
if(tip == OP_SELL && osl==ocp) //Ордер SELL закрылся по по SL значит покупаем
{
OrderSend(Symbol(),OP_BUY,ol*K_Martin,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
}
if(tip == OP_SELL && otp==ocp) //Ордер SELL закрылся по по TP значит продаем
{
OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point, Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
} 
if(tip == OP_BUY && osl==ocp) //Ордер BUY закрылся по SL значит продаем
{
OrderSend(Symbol(),OP_SELL,ol*K_Martin,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
}
if(tip == OP_BUY && otp==ocp) //Ордер BUY закрылся по по TP значит покупаем
{
OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
} 
}
return(0);
}

 
Top2n:

助けてください。何の役にも立たずに一日中苦労している。

オーダーはピックアップ(メインBAY、セールズストップはセーフティとして保留)。

閉店間際にノーロスで売れ残り、同じ場所で再び延期。

これを回転させ、https://www.mql5.com/ru/code/8846.
 
7777877:


最後に念のため、最後の段落の私の感想をご確認ください...。そこで、上記のような専門家にお願いしてみましょう。

それから、文字列の中。

GV-variable」というボックスに整数型Expertsの変数を入れて保存しています(double型に変換しています)。そして、もし(仮に)Expert Advisorに文字列があったとして

というのは、int型の変数に結果を書き込むコマンドがあることを意味します。この場合、コンパイラは。

* は、double 型の変数の値を取り出してしまう。

* Experts 変数の値に必要な変更を加えます。

* この値を変数New_Expertsに代入し、...

* 変数 New_Experts の値を "int" ボックスに入れる。

つまり、変数型は、ある値の単なる外部ラッパー/パッケージ以外の何ものでもないのですね。そして、ダウングレードは数値に対してのみ許可され、文字列は数値に変換されないので、GV変数は文字列型にはなり得ないのです。

そうだろ?

回答ありがとうございました。

そうではありません。ポイントは、Experts変数がすでにint型であるため、値を代入する前に型変換を行う必要があること、つまり、コンパイラが

*double型の 値(プログラム上では名前はなく、単にコンパイラが知っているメインメモリかCPUレジスタのアドレスに書き込まれます)を取り出しました。

* 上記の変数の値に必要なすべての変更を加え、Experts変数に新しい値(int型!)を書き込みました。

* この値(int!型)を変数New_Expertsに代入しました。両者は同じ型なので、あるメモリ位置から別のメモリ位置へ値を転送するだけでよい。


追伸:自分の行いをここまで細かく把握している人がいるのは素晴らしいことだと思います。実際、冗談抜きで。連絡を取り合うこと。

 
Andrew1001:

こんばんは!EAコードの変更にご協力お願いします。
1.テストではすべてうまくいきますが、取引では最初の取引を手動で開始しなければならず、ストップとテイクも手動です。価格が新しいティックに達したときに、EAが自動的に取引を開始するようにしたいのですが。
ストップロスをトリガーした場合、次のポジションは前回のロットの2倍で建てられるので、ロットは理論上無限大に増える可能性がある(私の場合、最大51.2)ので、閾値を変更できるように制限したい(例えば、0.8)です。閾値に達してストップがかかると、EAは切断されず、0.1からやり直されます。


試してみてください。

extern double Lot=0.1,K_Martin=2,porog=0.8;
extern int TP=22,SL=20,Magic=233;
extern bool poz1_up=true;//ваш выбор:1-ая покупка или продажа(false)? 
extern bool Trade=true;//торговля разрешить?
bool fix;int init(){fix=true;return(0);}int deinit(){return(0);}
int start(){double oop,ocp,osl,otp,ol,lotos;int closetime=0,lastorder=0,tip=0;if(!Trade)return(0);
if(poz1_up&&fix){OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);fix=0;}  
if(!poz1_up&&fix){OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);fix=0;}
for(int i=0;i<OrdersHistoryTotal();i++)
  {if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
   if(OrderMagicNumber()!=Magic)continue;
   if(closetime<OrderCloseTime())lastorder=OrderTicket();}
if(OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY))
  {tip=OrderType();oop=OrderOpenPrice();osl=OrderStopLoss();
   otp=OrderTakeProfit();ol=OrderLots();ocp=OrderClosePrice();}
Print("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия--[",OrderOpenPrice(),
        "]--","цена закрытия--[",OrderClosePrice(),"]--","прибыль--[",OrderProfit(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==0)
  {if(tip==OP_SELL){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot; 
     OrderSend(Symbol(),OP_BUY,lotos,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}
     if(otp==ocp)OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(tip==OP_BUY){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot;
     OrderSend(Symbol(),OP_SELL,lotos,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(otp==ocp)OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}}return(0);}
//+------------------------------------------------------------------+
 
こんにちは。テスターで取引をする方法を自分で読むには、どこを見ればいいか教えてください。ありがたいことです。
 

皆さん、こんにちは。

利用可能な注文をすべてクローズするスクリプトがあるのですが。

その中の3行が理解できない。

難しくなければ、初心者のためにロシア語に翻訳してください。

チュートリアルを勉強しましたが、これほど長い論理表現には出会えませんでした。

添付しているスクリプトありがとうございます。

ファイル: