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

 
NameLess:


お気づきのように、本当の理由はコードを見ることではなく、その仕組みを理解することにあります。Expert Advisorを信頼するならば、成功し、すべてがうまくいくことを祈ります)

私自身、自転車を発明し、フクロウをゼロから書きましたが、物事がどこでどのように動くのか、なぜ動かないのか、どこを見ればエラーが出るのかを知っています)

そんなもんだ)


ありがとうございます。もう、いい線いってますね!)))私は掘り下げる必要がありましたが、私は私が欲しかったものを実現しました(少なくとも、何とか動作します :)))).
 
NameLess:
注文番号管理の設定方法をご存知ですか?そうですね、この質問には思わず笑みがこぼれ、ところどころで笑いに変わりますね(^^)))でも、mt-shのコードをつかい始めてからまだ1週間くらいです。私はまだすべての単語を知りません ))))スマート )))
 
nemo811:
注文番号管理の設定方法をご存知ですか?そうですね、この質問には、おそらく隠しきれない笑いが起こり、ところどころで笑いに変わります))))でも、mt-shのコードをつかい始めてからまだ1週間くらいです。私はまだすべての単語を知りません ))))賢い ))


専門家を名乗ることはできませんが)))

番号管理の意味がよくわからないのですが? ある条件で2回注文を開く必要がある場合、この条件を作成する必要があります。

一般的に、私は半年ほど前に自分でプログラムを書き始めましたが、ある簡単な内容が役に立ちました。EAに何をさせたいか、特定のコードの一部を考えるのです。

この場合、例を挙げていただいた方がわかりやすいかもしれませんし、解決策がわかれば、何をどうすればいいのか、より具体的にお伝えできるかと思います:)

 

83ページの例、sergeevの タスク

コードはうまくいきました - ありがとうございます。でも、経験者がそういう言葉を発すると、「どうしたんだろう」と思うようになる。

)))

 
nemo811:

83ページの例、sergeevの タスク

コードはうまくいきました - ありがとうございます。でも、経験者がそういう言葉を発すると、「どうしたんだろう」と思うようになる。

)))


コードがやるべきことをやっていれば、それでいいのです))) 私が言いたかったのは、コードがノンストップで注文を開くことができるということでしょうが、すべてを一度だけ開いて延期するようにしましたので、大丈夫です))
 
NameLess:

コードがやるべきことをやっていればOK))おそらく私が言いたかったのは、コードはノンストップで注文を開くことができるということですが、1回のオープンとデフォールトでやっています)。

よかったです。また、ありがとうございました。
 
nemo811:

ちなみに、以下のようなものを入れることをお勧めします。

if ( OrdersTotal()!=0)

{

BUY = false;

BUY_STOP = false;

BUY_LIMIT = false;

SELL = false;

SELL_STOP = false;

SELL_LIMIT = false;

}

これは、クライアントを再起動する必要がある場合に、オープンポジションを持って いる場合の保護であり、そうでない場合は、すべての注文バッチを再開することになります。

また、「それぞれの行について論理的に考えてみて、何が原因で動作しないのかを考えてみてください。

 
nemo811:

現在制作中の少し古いバージョンです。作者のdrknn さんから、アップロードの許可をいただきました。


彼は、単にそれを世に出すことを許可しただけでなく、あなたが望むようにコードを変更し、それを販売し、さらにあなたが望む人に著作権を与えることを公然と許可したのです)

ただ、そこで権利関係の争いになるのは勘弁してください :)

 
sergeev:
インジケータ経由https://docs.mql4.com/ru/indicators/iBandsOnArray
おつかれさまでした
 
NameLess:

ちなみに、以下のようなものを入れることをお勧めします。

if ( OrdersTotal()!=0)

{

BUY = false;

....

これは、クライアントを再起動する必要がある場合に、未決済のポジションがある場合の保護機能です。

ありがとうございます。これは重要なポイントです。この問題を解決し、カウンターを追加しました(sergeev さんに感謝します)。

これでコードは以下のようになりました(端末を再起動しても不要なデータは開きません)。

//--------------------------------------------------------------------
extern int     MAGIC       = 0;        //уникальный номер ордера
extern bool    BUY         = false;    //открыть ордер BUY
extern bool    BUY_STOP    = false;    //поставить ордер BUY STOP
extern bool    BUY_LIMIT   = false;    //поставить ордер BUY LIMIT
extern bool    SELL        = false;    //открыть ордер SELL
extern bool    SELL_STOP   = false;    //поставить ордер SELL STOP
extern bool    SELL_LIMIT  = false;    //поставить ордер SELL LIMIT
extern double  Lot         = 0.1;      //объем ордера
extern int     takeprofit  = 0;        //уровень выставления TP, если 0, то TP не выставляется
extern int     stoploss    = 0;        //уровень выставления SL, если 0, то SL не выставляется
extern int     DistanceSet = 40;       //расстояние от рынка для отложенника
extern int     Proskalz    = 3;        //максимально допустимое отклонение цены для рыночных ордеров
//--------------------------------------------------------------------
double SL,TP;
//--------------------------------------------------------------------
int start()
{
   if (BUY)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy");
      BUY=false;
   }
   if (SELL)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell");
      SELL=false;
   }
   if (BUY_STOP)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + DistanceSet*Point + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask + DistanceSet*Point - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy Stop");
      BUY_STOP=false;
   }
   if (SELL_STOP)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid - DistanceSet*Point - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid - DistanceSet*Point + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell Stop");
      SELL_STOP=false;
   }
   if (BUY_LIMIT)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask - DistanceSet*Point + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask - DistanceSet*Point - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy Limit");
      BUY_LIMIT=false; 
   }
   if (SELL_LIMIT)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid + DistanceSet*Point - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid + DistanceSet*Point + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell Limit");
      SELL_LIMIT=false;
   }
return(0);
}
void OPENORDER(string ord)
{
   int SchBuy=SchBuy_b(MAGIC);
   int SchSell=SchSell_b(MAGIC);
   int SchBuyStop=SchBuyStop_b(MAGIC);
   int SchSellStop=SchSellStop_b(MAGIC);
   int SchBuyLimit=SchBuyLimit_b(MAGIC);
   int SchSellLimit=SchSellLimit_b(MAGIC);
   int ticket = -1;
   int err;
   while (ticket<0)
   {
      if (SchBuy<1) {if (ord=="Buy") ticket=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSell<1) {if (ord=="Sell") ticket=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchBuyStop<1) {if (ord=="Buy Stop") ticket=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSellStop<1) {if (ord=="Sell Stop") ticket=OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid - DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchBuyLimit<1) {if (ord=="Buy Limit") ticket=OrderSend(Symbol(),OP_BUYLIMIT, Lot,NormalizeDouble(Ask - DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSellLimit<1) {if (ord=="Sell Limit") ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lot,NormalizeDouble(Bid + DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}      
      if (ticket==-1) //неудачная попытка
      {  
         ShowERROR();
         err++;Sleep(2000);RefreshRates();
      }
      if (ticket || err >10) return;
   }
return;
}                                    
//--------------------------------------------------------------------
void ShowERROR()
{
   int err=GetLastError();
   switch ( err )
   {                  
      case 1:   return;
      case 2:   Alert("Нет связи с торговым сервером ",Symbol());return;
      case 3:   Alert("Error неправильные параметры ",Symbol());return;
      case 130: Alert("Error близкие стопы   Ticket ",Symbol());return;
      case 134: Alert("Недостаточно денег   ",Symbol());return;
      case 146: Alert("Error Подсистема торговли занята ",Symbol());return;
      case 129: Alert("Error Неправильная цена ",Symbol());return;
      case 131: Alert("Error Неправильный объем ",Symbol());return;
      case 4200:Alert("Error Объект уже существует ",Symbol());return;
      default:  Alert("Error  " ,err," ",Symbol());return;
   }
}

+適切なカウンタ。

ありがとうございます。