spoiltboy : EA는 마지막 X 막대의 최소값과 최대값을 계산하고 주문합니다. 또한, 최대값이 감소하거나 최소값이 증가하면 해당 주문을 삭제하고 새 데이터를 사용하여 열어야 합니다.
설정 가격을 수정할 수 있을 때 삭제하고 새 수준에 대한 상대적인 테이크를 중단하는 이유는 무엇입니까? 결국, 예금이 없고 시장 포지션이 없는 경우에만 예금을 설정했습니다. 이는 다음을 의미합니다. 시장에 보류 중인 주문 이 있고 해당하는 시장 포지션이 없는 경우 보류 중인 주문의 가격을 수정하면 됩니다. 새로운 수준.
매번 최대 및 최소 발견 가격을 기억하십시오. 현재 발견된 최대 가격이 이전 가격보다 낮으면 보류 중인 BuyLimit을 수정하고 새 최대 가격을 저장합니다. 가격 Min - 미러.
오류는 주문 선택 영역의 코드 어딘가에 있습니다.
예, 나머지는 만지지 않습니다.
어떤 경우든 조건부 줄 뿐만 아니라 앞 뒤 코드를 봐야 합니다.
...
SRC 의 도움으로 코드를 조합하고 정상적으로 삽입하는 것이 운명이 아닙니까?
삭제를 시도하기 전에 OrderSelect를 사용 하지 않는 이유는 무엇입니까?
...
하나 의 주문과 위치 수에 대한 구조의 필수 필드를 채울 수 있는데 왜 그렇게 많은 사이클이 필요한지 명확하지 않습니다.
과잉을 제거하고 제거도 제거했습니다. 티켓으로 삭제할 필요는 없지만(삭제하기 전에 여전히 알아야 함), 주기에서 인덱스별로 원하는 순서를 찾아 삭제합니다.
그래서 조건이 생겼을 때 호출해야 하는 주문을 검색하고 삭제하는 함수가 하나 더 필요 하지만, 당신의 코드를 보고 바로 이해할 시간이 없었고 알아낼 시간이 없었습니다. 필요한 조건을 글로 적어주시면 삭제 방법을 알려드리겠습니다.
보지 않고 무릎을 꿇고 글을 작성하다 보니 구조에 주문수와 포지션을 채우는 기능에 막힌 부분이 있을 수 있으니 확인은 하지 않았습니다.
input double LotB= 0.1 ; // Лот Buy
input double LotS= 0.1 ; // Лот Sell
input int Pointsl= 100 ; // StopLoss в пунктах
input int Pointtp= 100 ; // TakeProfit в пунктах
input int NumBars= 10 ; // Количество баров для поиска Max/Min
input int Magic= 100500 ; // Magic
//--- global variables
struct DataNumOrders
{
int buy; // Количество позиций Buy
int sell; // Количество позиций Sell
int buy_limit; // Количество ордеров BuyLimit
int buy_stop; // Количество ордеров BuyStop
int sell_limit; // Количество ордеров SellLimit
int sell_stop; // Количество ордеров SellStop
};
DataNumOrders numOrders; // Количество ордеров
double lotB, lotS;
int pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
numBars=(NumBars< 1 ? 1 :NumBars> Bars ? Bars :NumBars);
pointsl=(Pointsl< 0 ? 0 :Pointsl);
pointtp=(Pointtp< 0 ? 0 :Pointtp);
double minLot= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MIN );
double maxLot= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MAX );
lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick ()
{
//--- заполним структуру количеством ордеров и позиций
GetNumOrders( Symbol (),Magic,numOrders);
//--- найдём максимальную и минимальную цены за bars свечей
double maxPrice= 0.0 ; double minPrice= DBL_MAX ;
for ( int i= 0 ; i<numBars; i++) {
double max_i= iHigh ( Symbol (), PERIOD_CURRENT ,i);
if (max_i>maxPrice) maxPrice=max_i;
double min_i= iLow ( Symbol (), PERIOD_CURRENT ,i);
if (min_i<minPrice) minPrice=min_i;
}
//--- выставим BuyLimit
if (numOrders.buy_limit== 0 && numOrders.buy== 0 ) {
double slB=(pointsl== 0 ? 0 : NormalizeDouble (minPrice-pointsl* Point (), Digits ()));
double tpB=(pointtp== 0 ? 0 : NormalizeDouble (minPrice+pointtp* Point (), Digits ()));
int ticketUP= OrderSend ( Symbol (), OP_BUYLIMIT , lotB, minPrice, 3 , slB, tpB, "" , Magic, 0 , clrRed );
if (ticketUP==- 1 ) Print ( "ERROR OP_BUY" );
else Print ( "OP_BUY OK" );
}
//--- выставим SellLimit
if (numOrders.buy_limit== 0 && numOrders.sell== 0 ) {
double slS=(pointsl== 0 ? 0 : NormalizeDouble (maxPrice+pointsl* Point (), Digits ()));
double tpS=(pointtp== 0 ? 0 : NormalizeDouble (maxPrice-pointtp* Point (), Digits ()));
int ticketD= OrderSend ( Symbol (), OP_SELLLIMIT , lotS, maxPrice, 3 , slS, tpS, "" , Magic, 0 , clrBlue );
if (ticketD==- 1 ) Print ( "ERROR OP_SELL" );
else Print ( "OP_SELL OK" );
}
//--- Тут должно быть удаление, но не понятно при каких условиях. Опишите их
//---
string a=(numBars== 1 )? "bar: " : IntegerToString (numBars, 1 )+ " bar's: " ;
Comment ( "Last " , a, "max " , DoubleToStr (maxPrice, Digits ()), ", min " , DoubleToStr (minPrice, Digits ()), "." );
}
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров |
//+------------------------------------------------------------------+
void GetNumOrders( string symbol_name, int magic_number, DataNumOrders &number_of) {
ZeroMemory (number_of);
for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) {
if ( OrderSelect (i, SELECT_BY_POS )) {
if ( OrderMagicNumber ()!=magic_number) continue ;
if ( OrderSymbol ()!=symbol_name) continue ;
if ( OrderType ()== OP_BUY ) number_of.buy++;
if ( OrderType ()== OP_BUYLIMIT ) number_of.buy_limit++;
if ( OrderType ()== OP_BUYSTOP ) number_of.buy_stop++;
if ( OrderType ()== OP_SELL ) number_of.sell++;
if ( OrderType ()== OP_SELLLIMIT ) number_of.sell_limit++;
if ( OrderType ()== OP_SELLSTOP ) number_of.sell_stop++;
}
}
}
//+------------------------------------------------------------------+
일반적으로 이 코드로 무엇을 하려는 건가요? 실례합니다. 소름 끼치는 코드입니다.
다음을 작성하는 방법:
만약 가격이 1% 변했다 면, 그날의 OPEN이 그 날의 Close보다 1% 더 많다고 합시다.
다음을 작성하는 방법:
만약 가격이 1% 변했다면, 그날의 OPEN이 그 날의 Close보다 1% 더 많다고 합시다.
글쎄, 그것은 또 다른 문제입니다. 이제 1%가 무엇에 상대적인지 분명합니다.)
EA는 마지막 X 막대의 최소값과 최대값을 계산하고 주문합니다. 또한, 최대값이 감소하거나 최소값이 증가하면 해당 주문을 삭제하고 새 데이터를 사용하여 열어야 합니다.
설정 가격을 수정할 수 있을 때 삭제하고 새 수준에 대한 상대적인 테이크를 중단하는 이유는 무엇입니까? 결국, 예금이 없고 시장 포지션이 없는 경우에만 예금을 설정했습니다. 이는 다음을 의미합니다. 시장에 보류 중인 주문 이 있고 해당하는 시장 포지션이 없는 경우 보류 중인 주문의 가격을 수정하면 됩니다. 새로운 수준.
매번 최대 및 최소 발견 가격을 기억하십시오. 현재 발견된 최대 가격이 이전 가격보다 낮으면 보류 중인 BuyLimit을 수정하고 새 최대 가격을 저장합니다. 가격 Min - 미러.