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

 
amsgif80 #:

挿入しようとしたコードはこれです。

コードの先頭にこれを投げる:
enum ENUM_DIRECTION{
DIRECTION_BUY = 0, // 買いのみ
DIRECTION_SELL = 1, // 唯一の販売
DIRECTION_ANY = 2, // 買い&販売
};

入力 ENUM_DIRECTION inp_direction = DIRECTION_ANY; // 許可された取引の方向


さらにコードで買うとどこに売って開く場所を見つけて ください。start() または OnTick() 関数の内部を見る
条件に買いがある場合追加:
if(inp_direction!=DIRECTION_SELL)
条件に売りがある場合追加:
if(inp_direction!=DIRECTION_BUY)です。

どこに置いたんだ?
 
MakarFX #:
どこに入れたんですか?
//+------------------------------------------------------------------+
| 移動平均.mq5
//| 著作権:2009-2013, MetaQuotes Software Corp.
//+------------------------------------------------------------------+





#property copyright "Copyright 2009-2013, MetaQuotes Software Corp.
#プロパティリンク"https://www.mql5.com"
#property version "1.00"

enum ENUM_DIRECTION{
DIRECTION_BUY = 0, // 買いのみ
DIRECTION_SELL = 1, // 売りのみ
DIRECTION_ANY = 2, // 買いと売り
};

input ENUM_DIRECTION inp_direction = DIRECTION_ANY; // 取引可能な方向

#include <TradeTrade.mqh>

input double MaximumRisk = 0.02; // 最大リスク(パーセント表示
input double DecreaseFactor = 3; // デクリリースファクター
input int MovingPeriod = 12; // 移動平均の期間
input int MovingShift = 6; // 移動平均のシフト量



//---
int ExtHandle=0;


//+------------------------------------------------------------------+
//| 専門家による初期化機能
//+------------------------------------------------------------------+




int OnInit(void)
{
//---
ExtHandle=iMA(_Symbol,_Period,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE);
if(ExtHandle==INVALID_HANDLE)
{
printf("Error creating MA indicator");
return(INIT_FAILED);
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| エキスパートティック機能
//+------------------------------------------------------------------+
void OnTick(void)
{
//---
if(PositionSelect(_Symbol))
CheckForClose()。
さもなくば
CheckForOpen()です。
//---
}
//+------------------------------------------------------------------+
//| 専門家による初期化関数
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| 最適なロットサイズを計算する
//+------------------------------------------------------------------+
Double TradeSizeOptimized(void)
{
倍価格=0.
ダブルマージン=0.0
//--- ロットサイズを計算する
if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,価格))
return(0.0);
if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
return(0.0);
if(マージン<=0.0)
return(0.0);

double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/margin,2);
//--- 負け続けている取引の長さを計算します。
if(DecreaseFactor>0)
{
//--- 全取引履歴を要求する
HistorySelect(0,TimeCurrent())。
//--
int orders=HistoryDealsTotal(); //総取引件数
int losses=0; // 一連の負けトレードの数

for(int i=orders-1;i>=0;i--)
{
ulong ticket=HistoryDealGetTicket(i)。
if(ticket=0)の場合
{
Print("HistoryDealGetTicketに失敗しました、取引履歴がありません");
が壊れる。
}
//--- トレードシンボルのチェック
if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol)。
を続ける。
//--- 利益を確認する
double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
if(profit>0.0)の場合
が壊れる。
if(profit<0.0)の場合
の損失が発生します。
}
//---
if(losses>1)
lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1)となります。
}
//--- 取引量の正規化および許容値のチェック
double stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
lot=stepvol*NormalizeDouble(lot/stepvol,0) とする。

double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
if(lot<minvol)
lot=minvol;

double maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
if(lot>maxvol)
lot=maxvol;
//---取引数量の値を返す
return(lot)です。
}


//+------------------------------------------------------------------+
///オープンポジションの状態を確認する|
//+------------------------------------------------------------------+
void CheckForOpen(void)
{
MqlRates rt[2]です。
//--- 値段をコピーする
if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates of ",_Symbol," failed, no history");
を返します。
}
//--新しいバーの最初のティックでのみ取引する
if(rt[1].tick_volume>1)とする。
を返します。
//--- 移動平均の現在値を取得
double ma[1];
if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)。
{
Print("CopyBuffer from iMA failed, no data");
を返します。
}
//--- シグナルチェック
ENUM_ORDER_TYPE signal=WRONG_VALUE。

if(rt[0].open>ma[0] && rt[0].close<ma[0])
signal=ORDER_TYPE_SELL; // 売りの条件 if(inp_direction!=DIRECTION_BUY)
さもなくば
{
if(rt[0].open<ma[0] && rt[0].close>ma[0])
signal=ORDER_TYPE_BUY; // 買いの条件 if(inp_direction!=DIRECTION_SELL)です。
}
//--- 追加のチェック
if(signal!=WRONG_VALUE)
if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))とする。
if(Bars(_Symbol,_Period)>100)
{
CTradeトレード
trade.PositionOpen(_Symbol,signal,TradeSizeOptimized().Trade.PositionOpen(_Symbol))。
SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK,)
0,0);
}
//---
}
//+------------------------------------------------------------------+
///クローズポジションの条件をチェックする|
//+------------------------------------------------------------------+
void CheckForClose(void)
{
MqlRates rt[2]です。
//--- 値段をコピーする
if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates of ",_Symbol," failed, no history");
を返します。
}
//--新しいバーの最初のティックでのみ取引する
if(rt[1].tick_volume>1)とする。
を返します。
//--- 移動平均の現在値を取得
double ma[1];
if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)。
{
Print("CopyBuffer from iMA failed, no data");
を返します。
}
//--- 先ほどPositionSelect()で選択したポジションの型を取得します。
bool signal=false。
long type=PositionGetInteger(POSITION_TYPE)。

if(type==(long)POSITION_TYPE_BUY && rt[0].open>ma[0] && rt[0].close<ma[0])
signal=trueとした。
if(type==(long)POSITION_TYPE_SELL && rt[0].open<ma[0] && rt[0].close>ma[0])
signal=trueとした。
//--- 追加のチェック
もしもし
if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))とする。
if(Bars(_Symbol,_Period)>100)
{
CTradeトレード
trade.PositionClose(_Symbol,3)。
}
//---
}
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 

このセクションは次のようになります。

 //--- проверка сигналов
   ENUM_ORDER_TYPE signal=WRONG_VALUE;

   if(rt[0].open>ma[0] && rt[0].close<ma[0])
     {
      if(inp_direction!=DIRECTION_BUY)
         signal=ORDER_TYPE_SELL;
     }
   else
     {
      if(rt[0].open<ma[0] && rt[0].close>ma[0])
        {
         if(inp_direction!=DIRECTION_SELL)
            signal=ORDER_TYPE_BUY;
        }
     }
 //--- дополнительные проверки 
 
MakarFX #:

この部分は、このようにします。

マカー、これ。

      if(inp_direction==DIRECTION_SELL||inp_direction==DIRECTION_ANY)

は、これに置き換えるのがよいでしょう。

      if(inp_direction!=DIRECTION_BUY)
 
Alexey Viktorov #:

マカー、この一枚

は、これに置き換えるのがよいでしょう。

代用される)
 
MakarFX #:

このセクションは次のようになります。

心からありがとうございました一気に効いてきた、効いてきた。そして、どうすればいいのか、すでに頭を悩ませています))

 
同じ質問を、私自身の簡単なエディターで生成したExpert Advisorについて、もう一度してもいいですか?これでなんとか自分でできると思ったのですが、このBuy/Sellのコードをどこに入れればいいのかがわかりません。このBuy/Sellのコードをどこに貼り付ければいいのかわかりません。
 
amsgif80 #:
同じ質問を、私自身のシンプルなエディター生成のEAについて、もう一度してもいいですか?これでなんとか自分でできると思ったのですが、このBuy/Sellのコードをどこに入れればいいのかがわかりません。このBuy/Sellのコードをどこに貼り付ければいいのかがわかりません。
表示する
 
amsgif80 #:

フォーラムでコードを挿入する方法を紹介しました


 
MakarFX #:

何も変わっていないじゃないか。

こうとう

が中に入っています。

Makarさん、ありがとうございます。