안녕하세요. 고문이 MetaTraider 4에 썼던 것처럼, 그는 글 쓰는 법을 배웠습니다. 아직 모르는 것도 많고 모르는 것도 많다. 그리고 모든 것이 약간 다른 것으로 판명된 MetaTrader 5로 전송하기로 결정했습니다. 일반적으로 다른 조언자를 데려갔습니다. 구문 분석했습니다. 나는 내기를 열기 위해 코드를 복사했다. 일반적으로 오류는 없지만 정상적으로 작동하지 않습니다. 올바르게 이동할 수 있도록 도와주세요.
메타 트레이더 4:
int err = 0 ; double Lot = 0.01 ; // Лот double CoofLot = 0 ; double Ballance = AccountBalance (); double loss = 100 ; bool nap = true ; //true - 1 //false - 0 int start() { if ( OrdersTotal ()== 0 ) { if (Ballance != AccountBalance ()) { if ( AccountBalance () < Ballance ) { CoofLot++; Lot = pow ( 2 , CoofLot) * 0.01 ; if (nap == true ) { nap = false ; } else { nap = true ; } } if ( AccountBalance () > Ballance) { Lot = 0.01 ; CoofLot = 0 ; } } Ballance = AccountBalance ();
int order; if (nap == true ) { order = OrderSend ( Symbol (), OP_BUY ,Lot, Ask , 1 * Point , Ask -loss* Point , Ask +loss* Point ); // Вверх } else { order = OrderSend ( Symbol (), OP_SELL ,Lot, Bid , 1 * Point , Bid +loss* Point , Bid -loss* Point ); // Вниз }
voidOnTick () { MqlTick latest_price; // Будет использоваться для текущих котировок MqlTradeRequest mrequest; // Будет использоваться для отсылки торговых запросов MqlTradeResult mresult; if ( OrdersTotal ()== 0 ) { if (! SymbolInfoTick ( _Symbol ,latest_price)) { Alert ( "Ошибка получения последних котировок - ошибка:" , GetLastError (), "!!" ); return ; }
if (Ballance != ACCOUNT_BALANCE ) { if ( ACCOUNT_BALANCE < Ballance ) { CoofLot++; Lot = pow ( 2 , CoofLot) * 0.01 ; if (nap == true ) { nap = false ; } else { nap = true ; } } if ( ACCOUNT_BALANCE > Ballance) { Lot = 0.01 ; CoofLot = 0 ; } } Ballance = ACCOUNT_BALANCE ; int order; if (nap == true ) { mrequest.action = TRADE_ACTION_DEAL ; // немедленное исполнение mrequest.price = NormalizeDouble (latest_price.ask, _Digits ); // последняя цена ask mrequest.sl = NormalizeDouble (latest_price.ask - 100 * _Point , _Digits ); // Stop Loss mrequest.tp = NormalizeDouble (latest_price.ask + 100 * _Point , _Digits ); // Take Profit mrequest.symbol = _Symbol ; // символ mrequest.volume = Lot; // количество лотов для торговли mrequest.type = ORDER_TYPE_BUY ; // ордер на покупку mrequest.type_filling = ORDER_FILLING_FOK ; // тип исполнения ордера - все или ничего mrequest.deviation= 100 ; // проскальзывание от текущей цены //--- отсылаем ордер
order = OrderSend (mrequest,mresult); } else { mrequest.action = TRADE_ACTION_DEAL ; // немедленное исполнение mrequest.price = NormalizeDouble (latest_price.bid, _Digits ); // последняя цена Bid mrequest.sl = NormalizeDouble (latest_price.bid + 100 * _Point , _Digits ); // Stop Loss mrequest.tp = NormalizeDouble (latest_price.bid - 100 * _Point , _Digits ); // Take Profit mrequest.symbol = _Symbol ; // символ mrequest.volume = Lot; // количество лотов для торговли mrequest.type= ORDER_TYPE_SELL ; // ордер на продажу mrequest.type_filling = ORDER_FILLING_FOK ; // тип исполнения ордера - все или ничего mrequest.deviation= 100 ; // проскальзывание от текущей цены //--- отсылаем ордер
order = OrderSend (mrequest,mresult); } } return ; }
안녕하세요. 고문이 MetaTraider 4에 썼던 것처럼, 그는 글 쓰는 법을 배웠습니다. 아직 모르는 것도 많고 모르는 것도 많다. 그리고 모든 것이 약간 다른 것으로 판명된 MetaTrader 5로 전송하기로 결정했습니다. 일반적으로 다른 조언자를 데려갔습니다. 구문 분석했습니다. 나는 내기를 열기 위해 코드를 복사했다. 일반적으로 오류는 없지만 정상적으로 작동하지 않습니다. 올바르게 이동할 수 있도록 도와주세요.
코드는 다음과 같이 보일 것입니다(그러나 주의하십시오. 거래 계정( PositionsTotal )의 총 포지션 수를 확인합니다.
if ( PositionsTotal ()== 0 )
즉, 주어진 기호와 주어진 Magic에 대해 정확히 몇 개의 위치가 있는지 확인하지 않습니다(그런데 Magic은 전혀 설정되지 않음))
double balance=m_account.Balance(); // локальная переменная для хранения баланса на время OnTick
//--- считаем позиции по символу и по Magic int total= 0 ; for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--) // returns the number of open positions if (m_position.SelectByIndex(i)) // selects the position by index for further access to its properties if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==m_magic) total++;
if (total== 0 ) { //--- попытка обновить цены if (! RefreshRates ()) return ; // есил не удалось обновить цены - просто выходим
if (static_Balance!=balance) { if (balance<static_Balance) { CoofLot++; double lots= pow ( 2 ,CoofLot)* 0.01 ; // локальная переменная для временных расчётов лота //--- проверка корректности лота Lot=LotCheck(lots); if (Lot== 0.0 ) return ; if (nap) nap= false ; else nap= true ; } if (balance>static_Balance) { Lot= 0.01 ; CoofLot= 1.0 ; } } static_Balance=balance;
if (nap== true ) { double sl=m_symbol.NormalizePrice(m_symbol. Bid () - Loss*m_adjusted_point); // Stop Loss double tp=m_symbol.NormalizePrice(m_symbol. Bid () + Loss*m_adjusted_point); // Take Profit
if (m_trade.Buy(Lot, NULL ,m_symbol. Ask (),sl,tp)) { if (m_trade.ResultDeal()== 0 ) Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); else Print ( "Buy -> true. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); } else Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); } else { double sl=m_symbol.NormalizePrice(m_symbol. Ask ()+Loss*m_adjusted_point); // Stop Loss double tp=m_symbol.NormalizePrice(m_symbol. Ask ()-Loss*m_adjusted_point); // Take Profit
if (m_trade.Sell(Lot, NULL ,m_symbol. Ask (),sl,tp)) { if (m_trade.ResultDeal()== 0 ) Print ( "Sell -> false. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); else Print ( "Sell -> true. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); } else Print ( "Sell -> false. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); } } return ; } //+------------------------------------------------------------------+ //| Refreshes the symbol quotes data | //+------------------------------------------------------------------+ boolRefreshRates () { //--- refresh rates if (!m_symbol. RefreshRates ()) return ( false ); //--- protection against the return value of "zero" if (m_symbol. Ask ()== 0 || m_symbol. Bid ()== 0 ) return ( false ); //--- return ( true ); } //+------------------------------------------------------------------+ //| Lot Check | //+------------------------------------------------------------------+ double LotCheck( double lots) { //--- calculate maximum volume double volume= NormalizeDouble (lots, 2 ); double stepvol=m_symbol.LotsStep(); if (stepvol> 0.0 ) volume=stepvol* MathFloor (volume/stepvol); //--- double minvol=m_symbol.LotsMin(); if (volume<minvol) volume= 0.0 ; //--- double maxvol=m_symbol.LotsMax(); if (volume>maxvol) volume=maxvol; return (volume); } //+------------------------------------------------------------------+
여기:
손절매는 "4" 포인트로 설정됩니다. 즉, EURUSD 및 USDJPY 모두에서 올바르게 작동합니다.
현재로서는 m_symbol.RefreshRates() 함수를 사용하지 않는 것이 좋습니다. SymbolInfoTick()은 신선하지 않은 데이터를 반환할 수 있습니다. 그리고 개발자들이 이 주제를 읽는다면 SymbolInfoTick() 이 엉망 이지만 SB 클래스에서 사용된다는 사실에 다시 한 번 주의를 기울이십시오!
안녕하세요! 나는 독학을 위해 MQL5를 기반으로 다중 통화 Green-Red Candle 전략 EA를 만들기로 결정했습니다. 기본 기능은 구현되어 있지만 "Invalid price"와 같은 오류가 지속적으로 나타납니다. 가능한 원인을 제거하고 그에 따라 알려진 올바른 값으로 설정하기 위해 추가 검사를 추가했지만 오류는 사라지지 않았습니다. 더 이상 어떤 방향으로 나아가야 할지 모르겠습니다. 내가 어디서 실수를 했는지 말해줘? 소스 코드가 첨부되어 있습니다.
NickWelder : 안녕하세요! 독학을 위해 MQL5 기반의 다중 통화 Green-Red Candle 전략 EA를 만들기로 결정했습니다. 기본 기능은 구현되어 있지만 "Invalid price"와 같은 오류가 지속적으로 나타납니다. 가능한 원인을 제거하고 그에 따라 알려진 올바른 값으로 설정하기 위해 추가 검사를 추가했지만 오류는 사라지지 않았습니다. 더 이상 어떤 방향으로 나아가야 할지 모르겠습니다. 말해봐, 내가 어디에서 실수를 했니? 소스코드를 첨부합니다.
거래 작업을 수행 하기 전에 CSymbolInfo 거래 클래스 개체에서 가격을 업데이트해야 합니다. 내 모노 프로젝트(하나의 문자만 포함)에서 다음 기능을 사용합니다.
//+------------------------------------------------------------------+ //| Refreshes the symbol quotes data | //+------------------------------------------------------------------+ boolRefreshRates () { //--- refresh rates if (!m_symbol. RefreshRates ()) return ( false ); //--- protection against the return value of "zero" if (m_symbol. Ask ()== 0 || m_symbol. Bid ()== 0 ) return ( false ); //--- return ( true ); }
사용 - 가격을 업데이트한 다음 종료합니다. 가격이 성공적으로 업데이트되면 거래 작업이 수행됩니다.
//--- refresh rates if (!m_symbol. RefreshRates ()) return ;
if (m_trade.Buy(lots, NULL ,m_symbol. Ask (),sl,tp)) { if (m_trade.ResultDeal()== 0 ) Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); else Print ( "Buy -> true. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription()); } else Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(), ", description of result: " ,m_trade.ResultRetcodeDescription(
안녕하세요. 고문이 MetaTraider 4에 썼던 것처럼, 그는 글 쓰는 법을 배웠습니다. 아직 모르는 것도 많고 모르는 것도 많다. 그리고 모든 것이 약간 다른 것으로 판명된 MetaTrader 5로 전송하기로 결정했습니다. 일반적으로 다른 조언자를 데려갔습니다. 구문 분석했습니다. 나는 내기를 열기 위해 코드를 복사했다. 일반적으로 오류는 없지만 정상적으로 작동하지 않습니다. 올바르게 이동할 수 있도록 도와주세요.
메타 트레이더 4:
int err = 0 ;
double Lot = 0.01 ; // Лот
double CoofLot = 0 ;
double Ballance = AccountBalance ();
double loss = 100 ;
bool nap = true ; //true - 1
//false - 0
int start()
{
if ( OrdersTotal ()== 0 )
{
if (Ballance != AccountBalance ())
{
if ( AccountBalance () < Ballance )
{
CoofLot++;
Lot = pow ( 2 , CoofLot) * 0.01 ;
if (nap == true )
{
nap = false ;
}
else
{
nap = true ;
}
}
if ( AccountBalance () > Ballance)
{
Lot = 0.01 ;
CoofLot = 0 ;
}
}
Ballance = AccountBalance ();
int order;
if (nap == true )
{
order = OrderSend ( Symbol (), OP_BUY ,Lot, Ask , 1 * Point , Ask -loss* Point , Ask +loss* Point ); // Вверх
}
else
{
order = OrderSend ( Symbol (), OP_SELL ,Lot, Bid , 1 * Point , Bid +loss* Point , Bid -loss* Point ); // Вниз
}
if (order< 0 )
{
if ( GetLastError ()== 134 )
{
err= 1 ;
Print ( "NOT ENOGUGHT MONEY!!" );
}
return (- 1 );
}
}
return ( 0 );
}
MetaTrader 5로 전송한 방법은 다음과 같습니다.
double CoofLot = 0 ;
double Ballance = ACCOUNT_BALANCE ;
double loss = 100 ;
bool nap = true ; //true - 1
//false - 0
void OnTick ()
{
MqlTick latest_price; // Будет использоваться для текущих котировок
MqlTradeRequest mrequest; // Будет использоваться для отсылки торговых запросов
MqlTradeResult mresult;
if ( OrdersTotal ()== 0 )
{
if (! SymbolInfoTick ( _Symbol ,latest_price))
{
Alert ( "Ошибка получения последних котировок - ошибка:" , GetLastError (), "!!" );
return ;
}
if (Ballance != ACCOUNT_BALANCE )
{
if ( ACCOUNT_BALANCE < Ballance )
{
CoofLot++;
Lot = pow ( 2 , CoofLot) * 0.01 ;
if (nap == true )
{
nap = false ;
}
else
{
nap = true ;
}
}
if ( ACCOUNT_BALANCE > Ballance)
{
Lot = 0.01 ;
CoofLot = 0 ;
}
}
Ballance = ACCOUNT_BALANCE ;
int order;
if (nap == true )
{
mrequest.action = TRADE_ACTION_DEAL ; // немедленное исполнение
mrequest.price = NormalizeDouble (latest_price.ask, _Digits ); // последняя цена ask
mrequest.sl = NormalizeDouble (latest_price.ask - 100 * _Point , _Digits ); // Stop Loss
mrequest.tp = NormalizeDouble (latest_price.ask + 100 * _Point , _Digits ); // Take Profit
mrequest.symbol = _Symbol ; // символ
mrequest.volume = Lot; // количество лотов для торговли
mrequest.type = ORDER_TYPE_BUY ; // ордер на покупку
mrequest.type_filling = ORDER_FILLING_FOK ; // тип исполнения ордера - все или ничего
mrequest.deviation= 100 ; // проскальзывание от текущей цены
//--- отсылаем ордер
order = OrderSend (mrequest,mresult);
}
else
{
mrequest.action = TRADE_ACTION_DEAL ; // немедленное исполнение
mrequest.price = NormalizeDouble (latest_price.bid, _Digits ); // последняя цена Bid
mrequest.sl = NormalizeDouble (latest_price.bid + 100 * _Point , _Digits ); // Stop Loss
mrequest.tp = NormalizeDouble (latest_price.bid - 100 * _Point , _Digits ); // Take Profit
mrequest.symbol = _Symbol ; // символ
mrequest.volume = Lot; // количество лотов для торговли
mrequest.type= ORDER_TYPE_SELL ; // ордер на продажу
mrequest.type_filling = ORDER_FILLING_FOK ; // тип исполнения ордера - все или ничего
mrequest.deviation= 100 ; // проскальзывание от текущей цены
//--- отсылаем ордер
order = OrderSend (mrequest,mresult);
}
}
return ;
}
안녕하세요. 고문이 MetaTraider 4에 썼던 것처럼, 그는 글 쓰는 법을 배웠습니다. 아직 모르는 것도 많고 모르는 것도 많다. 그리고 모든 것이 약간 다른 것으로 판명된 MetaTrader 5로 전송하기로 결정했습니다. 일반적으로 다른 조언자를 데려갔습니다. 구문 분석했습니다. 나는 내기를 열기 위해 코드를 복사했다. 일반적으로 오류는 없지만 정상적으로 작동하지 않습니다. 올바르게 이동할 수 있도록 도와주세요.
코드는 다음과 같이 보일 것입니다(그러나 주의하십시오. 거래 계정( PositionsTotal )의 총 포지션 수를 확인합니다.
즉, 주어진 기호와 주어진 Magic에 대해 정확히 몇 개의 위치가 있는지 확인하지 않습니다(그런데 Magic은 전혀 설정되지 않음))
//| TestEA.mq5 |
//| Copyright © 2016, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link "http://wmua.ru/slesar/"
#property version "1.00"
//---
double Lot = 0.01 ;
double CoofLot = 1.0 ;
double loss = 100.0 ;
bool nap = true ;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
CoofLot = 1.0 ;
loss = 100.0 ;
nap = true ;
//---
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick ()
{
static double Balance= 0.0 ;
if (Balance== 0.0 )
Balance= AccountInfoDouble ( ACCOUNT_BALANCE );
if ( PositionsTotal ()== 0 )
{
MqlTick latest_price; // Будет использоваться для текущих котировок
if (! SymbolInfoTick ( _Symbol ,latest_price))
{
Alert ( "Ошибка получения последних котировок - ошибка:" , GetLastError (), "!!" );
return ;
}
if (Balance!= AccountInfoDouble ( ACCOUNT_BALANCE ))
{
if ( AccountInfoDouble ( ACCOUNT_BALANCE )<Balance)
{
CoofLot++;
Lot= pow ( 2 ,CoofLot)* 0.01 ;
if (nap== true )
{
nap= false ;
}
else
{
nap= true ;
}
}
if ( AccountInfoDouble ( ACCOUNT_BALANCE )>Balance)
{
Lot= 0.01 ;
CoofLot= 1.0 ;
}
}
Balance= AccountInfoDouble ( ACCOUNT_BALANCE );
MqlTradeRequest mrequest; // Будет использоваться для отсылки торговых запросов
MqlTradeResult mresult;
ZeroMemory (mrequest);
ZeroMemory (mresult);
bool order= false ;
if (nap== true )
{
mrequest.action = TRADE_ACTION_DEAL ; // немедленное исполнение
mrequest.price = NormalizeDouble (latest_price.ask, _Digits ); // последняя цена ask
mrequest.sl = NormalizeDouble (latest_price.bid - 100 * _Point , _Digits ); // Stop Loss
mrequest.tp = NormalizeDouble (latest_price.bid + 100 * _Point , _Digits ); // Take Profit
mrequest.symbol = _Symbol ; // символ
mrequest.volume = Lot; // количество лотов для торговли
mrequest.type = ORDER_TYPE_BUY ; // ордер на покупку
mrequest.type_filling = ORDER_FILLING_FOK ; // тип исполнения ордера - все или ничего
mrequest.deviation= 100 ; // проскальзывание от текущей цены
//--- отсылаем ордер
order= OrderSend (mrequest,mresult);
}
else
{
mrequest.action = TRADE_ACTION_DEAL ; // немедленное исполнение
mrequest.price = NormalizeDouble (latest_price.bid, _Digits ); // последняя цена Bid
mrequest.sl = NormalizeDouble (latest_price.ask + 100 * _Point , _Digits ); // Stop Loss
mrequest.tp = NormalizeDouble (latest_price.ask - 100 * _Point , _Digits ); // Take Profit
mrequest.symbol = _Symbol ; // символ
mrequest.volume = Lot; // количество лотов для торговли
mrequest.type= ORDER_TYPE_SELL ; // ордер на продажу
mrequest.type_filling = ORDER_FILLING_FOK ; // тип исполнения ордера - все или ничего
mrequest.deviation= 100 ; // проскальзывание от текущей цены
//--- отсылаем ордер
order= OrderSend (mrequest,mresult);
}
}
return ;
}
//+------------------------------------------------------------------+
또한 OrderSend 작업의 결과는 bool 유형입니다.
잔액을 저장하기 위해 정적 변수를 적용했습니다.
if (Balance== 0.0 )
Balance= AccountInfoDouble ( ACCOUNT_BALANCE );
- 즉, "Balance" 변수는 OnTick()에 대한 후속 호출에서 다시 생성되지 않지만 이전 틱의 값을 기억합니다.
나는 다음과 같이 쓸 것입니다.
//| TestEA.mq5 |
//| Copyright © 2017, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link "http://wmua.ru/slesar/"
#property version "1.001"
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>
CPositionInfo m_position; // trade position object
CTrade m_trade; // trading object
CSymbolInfo m_symbol; // symbol info object
CAccountInfo m_account; // account info wrapper
//---
double Lot = 0.01 ;
double CoofLot = 1.0 ;
double Loss = 100.0 ;
bool nap = true ;
//---
ulong m_magic = 15489 ; // magic number
ulong m_slippage = 10 ; // slippage
double m_adjusted_point; // point value adjusted for 3 or 5 points
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
m_symbol.Name( Symbol ()); // sets symbol name
if (! RefreshRates ())
{
Print ( "Error RefreshRates. Bid=" , DoubleToString (m_symbol. Bid (), Digits ()),
", Ask=" , DoubleToString (m_symbol. Ask (), Digits ()));
return ( INIT_FAILED );
}
m_symbol.Refresh();
//---
m_trade.SetExpertMagicNumber(m_magic);
//---
m_trade.SetDeviationInPoints(m_slippage);
//--- tuning for 3 or 5 digits
int digits_adjust= 1 ;
if (m_symbol. Digits ()== 3 || m_symbol. Digits ()== 5 )
digits_adjust= 10 ;
m_adjusted_point=m_symbol. Point ()*digits_adjust;
//---
CoofLot = 1.0 ;
Loss = 100.0 ;
nap = true ;
//---
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick ()
{
static double static_Balance= 0.0 ;
if (static_Balance== 0.0 )
static_Balance=m_account.Balance();
double balance=m_account.Balance(); // локальная переменная для хранения баланса на время OnTick
//--- считаем позиции по символу и по Magic
int total= 0 ;
for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--) // returns the number of open positions
if (m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==m_magic)
total++;
if (total== 0 )
{
//--- попытка обновить цены
if (! RefreshRates ())
return ; // есил не удалось обновить цены - просто выходим
if (static_Balance!=balance)
{
if (balance<static_Balance)
{
CoofLot++;
double lots= pow ( 2 ,CoofLot)* 0.01 ; // локальная переменная для временных расчётов лота
//--- проверка корректности лота
Lot=LotCheck(lots);
if (Lot== 0.0 )
return ;
if (nap)
nap= false ;
else
nap= true ;
}
if (balance>static_Balance)
{
Lot= 0.01 ;
CoofLot= 1.0 ;
}
}
static_Balance=balance;
if (nap== true )
{
double sl=m_symbol.NormalizePrice(m_symbol. Bid () - Loss*m_adjusted_point); // Stop Loss
double tp=m_symbol.NormalizePrice(m_symbol. Bid () + Loss*m_adjusted_point); // Take Profit
if (m_trade.Buy(Lot, NULL ,m_symbol. Ask (),sl,tp))
{
if (m_trade.ResultDeal()== 0 )
Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(),
", description of result: " ,m_trade.ResultRetcodeDescription());
else
Print ( "Buy -> true. Result Retcode: " ,m_trade.ResultRetcode(),
", description of result: " ,m_trade.ResultRetcodeDescription());
}
else
Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(),
", description of result: " ,m_trade.ResultRetcodeDescription());
}
else
{
double sl=m_symbol.NormalizePrice(m_symbol. Ask ()+Loss*m_adjusted_point); // Stop Loss
double tp=m_symbol.NormalizePrice(m_symbol. Ask ()-Loss*m_adjusted_point); // Take Profit
if (m_trade.Sell(Lot, NULL ,m_symbol. Ask (),sl,tp))
{
if (m_trade.ResultDeal()== 0 )
Print ( "Sell -> false. Result Retcode: " ,m_trade.ResultRetcode(),
", description of result: " ,m_trade.ResultRetcodeDescription());
else
Print ( "Sell -> true. Result Retcode: " ,m_trade.ResultRetcode(),
", description of result: " ,m_trade.ResultRetcodeDescription());
}
else
Print ( "Sell -> false. Result Retcode: " ,m_trade.ResultRetcode(),
", description of result: " ,m_trade.ResultRetcodeDescription());
}
}
return ;
}
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data |
//+------------------------------------------------------------------+
bool RefreshRates ()
{
//--- refresh rates
if (!m_symbol. RefreshRates ())
return ( false );
//--- protection against the return value of "zero"
if (m_symbol. Ask ()== 0 || m_symbol. Bid ()== 0 )
return ( false );
//---
return ( true );
}
//+------------------------------------------------------------------+
//| Lot Check |
//+------------------------------------------------------------------+
double LotCheck( double lots)
{
//--- calculate maximum volume
double volume= NormalizeDouble (lots, 2 );
double stepvol=m_symbol.LotsStep();
if (stepvol> 0.0 )
volume=stepvol* MathFloor (volume/stepvol);
//---
double minvol=m_symbol.LotsMin();
if (volume<minvol)
volume= 0.0 ;
//---
double maxvol=m_symbol.LotsMax();
if (volume>maxvol)
volume=maxvol;
return (volume);
}
//+------------------------------------------------------------------+
여기:
추가됨:
우리는 전략 테스터에서 한 번의 실행으로 매우 흥미로운 결과를 얻었습니다.
나는 다음과 같이 쓸 것입니다.
기본 기능은 구현되어 있지만 "Invalid price"와 같은 오류가 지속적으로 나타납니다. 가능한 원인을 제거하고 그에 따라 알려진 올바른 값으로 설정하기 위해 추가 검사를 추가했지만 오류는 사라지지 않았습니다. 더 이상 어떤 방향으로 나아가야 할지 모르겠습니다. 내가 어디서 실수를 했는지 말해줘? 소스 코드가 첨부되어 있습니다.
안녕하세요! 독학을 위해 MQL5 기반의 다중 통화 Green-Red Candle 전략 EA를 만들기로 결정했습니다.
기본 기능은 구현되어 있지만 "Invalid price"와 같은 오류가 지속적으로 나타납니다. 가능한 원인을 제거하고 그에 따라 알려진 올바른 값으로 설정하기 위해 추가 검사를 추가했지만 오류는 사라지지 않았습니다. 더 이상 어떤 방향으로 나아가야 할지 모르겠습니다. 말해봐, 내가 어디에서 실수를 했니? 소스코드를 첨부합니다.
거래 작업을 수행 하기 전에 CSymbolInfo 거래 클래스 개체에서 가격을 업데이트해야 합니다. 내 모노 프로젝트(하나의 문자만 포함)에서 다음 기능을 사용합니다.
//| Refreshes the symbol quotes data |
//+------------------------------------------------------------------+
bool RefreshRates ()
{
//--- refresh rates
if (!m_symbol. RefreshRates ())
return ( false );
//--- protection against the return value of "zero"
if (m_symbol. Ask ()== 0 || m_symbol. Bid ()== 0 )
return ( false );
//---
return ( true );
}
사용 - 가격을 업데이트한 다음 종료합니다. 가격이 성공적으로 업데이트되면 거래 작업이 수행됩니다.
if (!m_symbol. RefreshRates ())
return ;
if (m_trade.Buy(lots, NULL ,m_symbol. Ask (),sl,tp))
{
if (m_trade.ResultDeal()== 0 )
Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(),
", description of result: " ,m_trade.ResultRetcodeDescription());
else
Print ( "Buy -> true. Result Retcode: " ,m_trade.ResultRetcode(),
", description of result: " ,m_trade.ResultRetcodeDescription());
}
else
Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(),
", description of result: " ,m_trade.ResultRetcodeDescription(
이 구성을 대체하는 것보다 아름답고 "쉬운"솔루션을 알려주십시오.
이제 이것이 있지만 저에게는 너무 "무거운"솔루션이 있습니다.
if (time< 0 ) return (- 1 );
datetime Arr[],time1;
CopyTime (symbol,tf, 0 , 1 ,Arr);
time1=Arr[ 0 ];
if ( CopyTime (symbol,tf,time,time1,Arr)> 0 ) {
if ( ArraySize (Arr)> 2 ) return ( ArraySize (Arr)- 1 );
if (time<time1) return ( 1 );
else return ( 0 );
}
else return (- 1 );
}
이 구성을 대체하는 것보다 아름답고 "쉬운"솔루션을 알려주십시오.
이제 이것이 있지만 저에게는 너무 "무거운"솔루션이 있습니다.
if (time< 0 ) return (- 1 );
datetime Arr[],time1;
CopyTime (symbol,tf, 0 , 1 ,Arr);
time1=Arr[ 0 ];
if ( CopyTime (symbol,tf,time,time1,Arr)> 0 ) {
if ( ArraySize (Arr)> 2 ) return ( ArraySize (Arr)- 1 );
if (time<time1) return ( 1 );
else return ( 0 );
}
else return (- 1 );
}
//| Возвращает смещение бара по времени |
//+------------------------------------------------------------------+
int GetBarShift( const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) {
int res=- 1 ;
datetime last_bar;
if ( SeriesInfoInteger (symbol_name,timeframe, SERIES_LASTBAR_DATE ,last_bar)) {
if (time>last_bar) res= 0 ;
else {
const int shift= Bars (symbol_name,timeframe,time,last_bar);
if (shift> 0 ) res=shift- 1 ;
}
}
return (res);
}
//+------------------------------------------------------------------+
나는 그것을 확인하지 않았습니다. 솔직히 말해서 - 항상 도달하지는 않습니다. 결과를 확인하고 게시하십시오.
이 구성을 대체하는 것보다 아름답고 "쉬운"솔루션을 알려주십시오.
이제 이것이 있지만 저에게는 너무 "무거운"솔루션이 있습니다.
if (time< 0 ) return (- 1 );
datetime Arr[],time1;
CopyTime (symbol,tf, 0 , 1 ,Arr);
time1=Arr[ 0 ];
if ( CopyTime (symbol,tf,time,time1,Arr)> 0 ) {
if ( ArraySize (Arr)> 2 ) return ( ArraySize (Arr)- 1 );
if (time<time1) return ( 1 );
else return ( 0 );
}
else return (- 1 );
}