どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 146

 

私は通常、注文を別の機能で送ります。これを最適化し、1つの関数で保留と成行注文の両方を送信できるようにしたいのです。

どうすれば正しく実装できるのか、アドバイスをお願いします。

注文を 出す際には、始値が買値の上(下)にあることを確認し、その他の点も考慮する必要があります。

他の人はどうしているのか見てみましょう。金さんが使った最もシンプルなバリエーションで考えてみよう。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2008                                                     |
//|  Описание : Открывает позицию и возвращает её тикет.                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
  color    clOpen;
  datetime ot;
  double   pp, pa, pb;
  int      dg, err, it, ticket=0;
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("OpenPosition(): Остановка работы функции");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    dg=MarketInfo(sy, MODE_DIGITS);
    pa=MarketInfo(sy, MODE_ASK);
    pb=MarketInfo(sy, MODE_BID);
    if (op==OP_BUY) pp=pa; else pp=pb;
    pp=NormalizeDouble(pp, dg);
    ot=TimeCurrent();
    ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      if (pa==0 && pb==0) Message("Проверьте в Обзоре рынка наличие символа "+sy);
      // Вывод сообщения об ошибке
      Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
            " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
      // Блокировка работы советника
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Длительная пауза
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66.666);
        if (ExistPositions(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
      }
      if (err==140 || err==148 || err==4110 || err==4111) break;
      if (err==141) Sleep(1000*100);
      if (err==145) Sleep(1000*17);
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      if (err!=135) Sleep(1000*7.7);
    }
  }
  return(ticket);
}

彼は全く何もチェックしない。この機能は、成行注文を開始するためだけのものであることがわかります。

これは論理的ではないと思うんです。注文を送る場合は、種類を問わない。私の思うように書くと、一見すると長すぎる。

一般論として、これらの点をより良く実現するためのヒントや手助けをお願いしたいのです。

 
hoz:

私は通常、注文を別の機能で送ります。これを最適化し、1つの関数で保留と成行注文の両方を送信できるようにしたいのです。

どうすれば正しく実装できるのか、アドバイスをお願いします。

注文を出す際には、始値が買値の上(下)にあることを確認し、その他の点も考慮する必要があります。

他の人はどうしているのか見てみましょう。金さんが使った最もシンプルなバリエーションで考えてみよう。

彼は全く何もチェックしない。この機能は、成行注文を開始するためだけのものであることがわかります。

これは論理的ではないと思うんです。注文を送る場合は、種類を問わない。私の思うように書くと、一見すると長すぎる。

総じて、これらの点をより良く実装するためのヒントとなるようなことをお聞かせください。

さて、イゴールの関数は、まさに関数名で示されたタスクを実行します。すべての調整とチェックは、この関数を呼び出す前に行う必要があります。結局のところ、この関数自体は与えられたタスクを実行するだけで、(関数に)渡されたパラメータでポジションを 開くだけで、それ以上のことはしません。必要なエラー処理も完璧にこなします。何が足りないのか、それは自分で開発することです。

例えて言うなら、お店でインスタントコーヒーを買うと、熱湯と砂糖と他の材料の自動混合がそれに提供されない - 自分でコーヒーを作る方法を知っていた方がいい。

 

みなさん、それは可能ですか?別のループ条件で書き換えてください...。

つまり、素晴らしいbbands_stopというインジケータがあるのです。


for (shift=Nbars-Length-1;shift>=0;shift--)

{

smax[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_UPPER,shift);

smin[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_LOWER,shift);

if (Close[shift]>smax[shift+1]) trend=1;

if (Close[shift]<smin[shift+1]) trend=-1;


bsmax[shift]=smax[shift]+0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);

bsmin[shift]=smin[shift]-0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);

if (trend>0)

UpTrendBuffer[shift]=bsmin[shift];

else

DownTrendBuffer[shift]=bsmax[shift];

}

前回の結果と同じようなコードを書くことは可能でしょうか?しかし、ループのため。

for(i = 0; i <= limit; i++) {

2日目にしてやっと見つけた。

 
皆さんこんにちは!もちろん質問はバカバカしいのですが、1pipを1ドルの価値にするために必要なロットサイズはいくらですか?
 
0.1
 
FEAR:
こんにちは、もちろん質問は、1ピップが1ドルの価値を持つために、ロットがどのくらい必要なのか、という愚かなものです。
土地の広さによって異なります。
 
nikelodeon:
0.1
必ずしもそうではない
 
PapaYozh:
必ずしもそうではない
肩次第で...。
 
レバレッジ1:100で0.1
 
nikelodeon:
肩次第で...。

nikelodeon
レバレッジ1:100で0.1倍

アイテムスタイルに肩は関係ない。