[ARCHIVE] フォーラムを散らかさないように、どんなルーキーでも質問してください。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 3. - ページ 317

 
enya:

.

を挿入しています。 サイクルの問題やサイクル終了後の初期値の復元について

最後のトレードが利益を生んだのか、利益を生んでいないのかを答える関数はこちらです。

 double LastOrderProfit()
 {
   double Profit=0;
   int ticket; 
   for(int i=0; i<OrdersHistoryTotal(); i++){
     if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderSymbol()!=Symbol())continue;
     if(OrderMagicNumber()!=Magic)continue;
     if(OrderType()>1)continue;
     if(ticket<OrderTicket()){
        ticket=OrderTicket();
        Profit=OrderProfit()+OrderSwap()+OrderCommission();
     } 
   }     
 return(Profit);
 } 

そして、その答えをゼロと比較することで、TP/SLをそのままにするか、変更するかを決定するのです。

 if(LastOrderProfit()>0) newTPSL=false; else  newTPSL=true;
if(newTPSL)OrderModify(.......newSL,newTP...);
 

皆さん、こんにちは。IN10TION NewsReaderのインジケーターに興味があります。EAに添付したいのですが。

赤い線が表示され(Market.TdOpen)、Market.Price.DOWN(赤)が表示されたら売り

赤線が表示され(Market.TdOpen)、Market.Price.UP(緑)が表示されたら、買い

iCustomを試しましたが、うまくいきません。


extern bool Market.TdOpen = TRUE;
extern color Market.TdOpen.Color = Red;
extern bool Market.TdFibo = TRUE;
extern color Market.TdFibo.Color = C'0x00,0x32,0x00';
extern color Market.Price.UP = Lime;
extern color Market.Price.DOWN = Red;
extern bool Market.Price.Guide = TRUE;

添付ファイル
_yIN10TIONfNewsReaderov09.99kblite.ex4(115.59 KB) 削除

 

管理人さんには何度も申し訳ないのですが、まだ誰も半分も言ってくれないんです。これは、IsConnected()関数では正しく修正できないようなメッセージ、つまり接続失敗やリクエストなどをログに保存して出力するものです。そうでなければ、なぜEAが今何もしていないのかがわかりません。


ログファイルを読むには、以下のようなコードを提案してください。現在のログファイルを日付ごとに自動的に読み出して、プリンターに出力します。

どこで

while (result>0) {

部品からファイルを組み立てているところです。しかし、ファイル全体は必要なく、最後の一行だけでいいのです。修正にご協力ください。

void ReadWrite() {
   string tekTime=TimeStr1(CurTime(),1);
   string path=TerminalPath()+"\\logs\\"+tekTime+".log";
   string title="Чтение из файла";
   string msg;
   int result;
   int handle=_lopen(path,4);
   if (handle<0) {
      msg="Ошибка открытия файла";
      Print(msg);
      return;
   }
   result=_llseek (handle,0,0);
   string buffer="";
   //string char="x                      ";
   string char="x                                                                                                                                                                                                                                                         ";
   int count=0;
   result=_lread (handle,char,250);
   while (result>0) {
      buffer=buffer+char;
      char="x                                                                                                                                                                                                                                                         ";
      count++;
      result=_lread (handle,char,250);
   }
   result=_lclose (handle);
   msg=StringTrimRight(buffer);
   Print(msg);
}

//------------------расчет времени----------------
string TimeStr1(int taim,int tip)
{
   string sTaim;
   string sTaim1,sTaim2,sTaim3;
   if (tip==1) 
   {
      int GD=TimeYear(taim);                  
      int MN=TimeMonth(taim);                  
      int DD=TimeDay(taim);  
      
      sTaim1 = DoubleToStr(GD,0);
      if (MN<10) sTaim2 = StringConcatenate(sTaim2,"0"+DoubleToStr(MN,0));
      else sTaim2 = StringConcatenate(sTaim2,DoubleToStr(MN,0));
      if (DD<10) sTaim3 = StringConcatenate("0",DoubleToStr(DD,0));
      else sTaim3 = DoubleToStr(DD,0);
      sTaim=sTaim1+sTaim2+sTaim3;
   }
   return(sTaim);
}
 

EAを変更するためのヘルプが必要

Expert Advisorは逆張りで取引してください。

売り指値 注文の代わりに買い 指値注文

と買い指値注文の売り

ファイル:
tke.mq4  18 kb
 
mersi:

最後の取引が利益を生んだのか、利益を生まなかったのかを答える関数はこちらです。

そして、その答えをゼロと比較することで、TP/SLをそのままにするか、変更するかを決定するのです。

この関数は、最後の 注文を必ず 返しますか?それとも、負けていない最初の注文を返して くれるのでしょうか?なぜ、チケットにチェックが入っているのですか?

私ならこうする。

//+----------------------------------------------------------------------------+
double LastOrderProfit() {
   double Profit=0;
   datetime t;
   int i, j;
   for (i=0; i<OrdersHistoryTotal(); i++) {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      if (OrderMagicNumber()!=Magic)                  continue;
      if (OrderSymbol()!=Symbol())                    continue;
      if (OrderType()>1)                              continue;
      if (t<OrderCloseTime()) {
         t=OrderCloseTime();
         j=i;
         }
      }
   if (OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)
      Profit=OrderProfit()+OrderSwap()+OrderCommission();
   return(Profit);
} 
//+----------------------------------------------------------------------------+

これは、最後に閉じた注文を正確に見つけるために、あなたの機能を再設計したものです。

クローズド・オーダーが全くない場合は、0を返すという欠点がある。従って、これを使用すると、履歴にクローズド・オーダーがあるかないかを確実に知ることはできません。結局のところ、返されたゼロは、注文が全くないことを示すのではなく、ゼロで閉じていることを示すのです。

 

アドバイスをお願いします。

については、インジケータ値のレンダリングにのみ関心があります。 これより先 バーです。しかし、新しいバーを 開くと、古い値がチャートに残ってしまう...。このゴミを強制的に削除するにはどうしたらいいのでしょうか?バー[0]はインジケータ値を計算して表示し、バー[1]~[Bar-1]はこれらの値をリセットするという条件を指定することは可能でしょうか。

double Buffer [1];            

int init()
  {

   IndicatorBuffers(1);
  
   SetIndexStyle(0,DRAW_ARROW);
   .........
 
   return(0);
  }

int deinit()
  {
   return(0);
  }

int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) counted_bars=0;
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
       for(int i=limit;i>=0;i--) 
     {
         Buffer [0] = ............;
     }
   return(0);
  }        
 

artmedia70:

注文が全く成立していない場合は、0を返すという欠点がある。従って、これを使用すると、履歴にクローズド・オーダーがあるかないかを確実に知ることはできません。結局、NULLが返ってきたからといって、注文がまったくないわけではなく、ゼロで決済されたことがわかる。

ありがとうございました。返信はありませんでしたが、以前私が質問した「利益の正しい計算方法」について回答していただきました。

Profit=OrderProfit()+OrderSwap()+OrderCommission();
 
Azerus:

アドバイスをお願いします。

については、インジケータ値のレンダリングにのみ関心があります。 これより先 バーです。しかし、新しいバーを開くと、古い値がチャートに残ってしまう...。このゴミを強制的に削除するにはどうしたらいいのでしょうか?バー[0]はインジケータ値を計算して表示し、バー[1]~[Bar-1]はこれらの値をリセットするという条件を指定することは可能でしょうか。

Start()の開始時に、バッファの値をEMPTY_VALUE で初期化する。つまり、新しいバーの出現で行い、ゼロバーのオープンタイムを確認し、ゴミ捨てのロジックを行うのです。

 
artmedia70:

この関数は、最後の 注文を必ず 返しますか?それとも最初に遭遇した ものが不採算にならないのか?なぜ、チケットにチェックが入っているのですか?

私ならこうする。

これは、最後の閉じた順番を正確に見つけるために、あなたの関数を変換するものです。

もし、クローズド・オーダーが全くなかった場合は、ゼロを返すという欠点がある。したがって、これを使用する場合、履歴の中にクローズド・オーダーがあるかどうかを確実に知ることはできません。返されたNULLは、注文が全くないことを示すわけではなく、ゼロで決済されたことを示す。

1.この関数は,履歴の中で最大のティッカーを持つ注文を 見つけます.これは,最後に決済された注文を意味します(もちろん,例外的な場合を除き,決済時刻の最大値を持つバリアントが望ましいでしょう).

2.この条件では 最初の注文は指定された TP/SL で発注され,2番目の注文のみ新しい TP/SL で発注することができます.つまり,この関数は最初の取引が 0 の場合のみ 0 を返すことができますが,履歴に決済済み注文がない場合は 0 を返しません.

最後にもうひとつ。あなたのバリアントでは、関数内でjと別のSELECTを使用することは冗長です。

で十分です。

 if (t<OrderCloseTime()) {
         t=OrderCloseTime();
      Profit=OrderProfit()+OrderSwap()+OrderCommission();
  }
   return(Profit);
 
snail09:
Start()の冒頭で、バッファをEMPTY_VALUEで初期化する。


どうですか?int init()の後のインジケータの行の 設定にこんなのがあります。

   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,165);                     
   SetIndexBuffer(0,Buffer);
   SetIndexEmptyValue(0,0.0);