price_speedometer/price_speedometer_test.mq5

618 lines
24 KiB
MQL5
Raw Permalink Normal View History

2026-05-19 23:26:31 +02:00
#include "price_speedometer.mqh"
void OnStart() {
test_period_in_ticks_zero_empty_ticks();
test_period_in_ticks_non_zero_empty_ticks();
test_period_in_ticks_zero_non_empty_ticks();
test_period_in_ticks_smaller_than_non_empty_ticks();
test_period_in_ticks_bigger_than_non_empty_ticks();
test_period_in_milliseconds_zero_empty_ticks();
test_period_in_milliseconds_non_zero_empty_ticks();
test_period_in_milliseconds_zero_non_empty_ticks();
test_period_in_milliseconds_smaller_than_non_empty_ticks();
test_period_in_milliseconds_bigger_than_non_empty_ticks();
test_copy_constructor();
test_copy_assignment();
Print("All tests passed.");
return;
}
void test_period_in_ticks_zero_empty_ticks() {
const int ticks_capacity = 256;
const int period_in_ticks = 0;
const long period_in_milliseconds = 0l;
Price_speedometer price_speedometer(ticks_capacity, period_in_ticks,
period_in_milliseconds);
price_speedometer.calculate_price_speeds();
price_speedometer.calculate_percents();
const double input_value_speed_per_ticks = 0.0;
const double input_value_directional_speed_per_ticks = 0.0;
const double input_value_percent_per_ticks = 0.0;
const double output_value_speed_per_ticks =
price_speedometer.get_speed_per_ticks();
const double output_value_directional_speed_per_ticks =
price_speedometer.get_directional_speed_per_ticks();
const double output_value_percent_per_ticks =
price_speedometer.get_percent_per_ticks();
if (output_value_speed_per_ticks != input_value_speed_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_directional_speed_per_ticks !=
input_value_directional_speed_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_percent_per_ticks != input_value_percent_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
return;
}
void test_period_in_ticks_non_zero_empty_ticks() {
const int ticks_capacity = 256;
const int period_in_ticks = 5;
const long period_in_milliseconds = 0l;
Price_speedometer price_speedometer(ticks_capacity, period_in_ticks,
period_in_milliseconds);
price_speedometer.calculate_price_speeds();
price_speedometer.calculate_percents();
const double input_value_speed_per_ticks = 0.0;
const double input_value_directional_speed_per_ticks = 0.0;
const double input_value_percent_per_ticks = 0.0;
const double output_value_speed_per_ticks =
price_speedometer.get_speed_per_ticks();
const double output_value_directional_speed_per_ticks =
price_speedometer.get_directional_speed_per_ticks();
const double output_value_percent_per_ticks =
price_speedometer.get_percent_per_ticks();
if (output_value_speed_per_ticks != input_value_speed_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_directional_speed_per_ticks !=
input_value_directional_speed_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_percent_per_ticks != input_value_percent_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
return;
}
void test_period_in_ticks_zero_non_empty_ticks() {
const int ticks_capacity = 256;
const int period_in_ticks = 0;
const long period_in_milliseconds = 0l;
Price_speedometer price_speedometer(ticks_capacity, period_in_ticks,
period_in_milliseconds);
const datetime time = 0ul;
const double bid = 0.0;
const double ask = 0.0;
double last = 1.0;
const ulong volume = 0ul;
const long time_msc = 1l;
const uint flags = 0u;
const double volume_real = 0.0;
const MqlTick tick_1 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_1);
last = -2.0;
const MqlTick tick_2 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_2);
last = 3.0;
const MqlTick tick_3 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_3);
last = -4.0;
const MqlTick tick_4 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_4);
last = 5.0;
const MqlTick tick_5 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_5);
price_speedometer.calculate_price_speeds();
price_speedometer.calculate_percents();
const double input_value_speed_per_ticks = 0.0;
const double input_value_directional_speed_per_ticks = 0.0;
const double input_value_percent_per_ticks = 0.0;
const double output_value_speed_per_ticks =
price_speedometer.get_speed_per_ticks();
const double output_value_directional_speed_per_ticks =
price_speedometer.get_directional_speed_per_ticks();
const double output_value_percent_per_ticks =
price_speedometer.get_percent_per_ticks();
if (output_value_speed_per_ticks != input_value_speed_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_directional_speed_per_ticks !=
input_value_directional_speed_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_percent_per_ticks != input_value_percent_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
return;
}
void test_period_in_ticks_smaller_than_non_empty_ticks() {
const int ticks_capacity = 256;
const int period_in_ticks = 3;
const long period_in_milliseconds = 0l;
Price_speedometer price_speedometer(ticks_capacity, period_in_ticks,
period_in_milliseconds);
const datetime time = 0ul;
const double bid = 0.0;
const double ask = 0.0;
double last = 1.0;
const ulong volume = 0ul;
const long time_msc = 1l;
const uint flags = 0u;
const double volume_real = 0.0;
const MqlTick tick_1 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_1);
last = -2.0;
const MqlTick tick_2 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_2);
last = 3.0;
const MqlTick tick_3 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_3);
last = -4.0;
const MqlTick tick_4 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_4);
last = 5.0;
const MqlTick tick_5 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_5);
price_speedometer.calculate_price_speeds();
price_speedometer.calculate_percents();
const double input_value_speed_per_ticks = 16.0;
const double input_value_directional_speed_per_ticks = 2.0;
const double input_value_percent_per_ticks = 2.0 / 16.0 * 100.0;
const double output_value_speed_per_ticks =
price_speedometer.get_speed_per_ticks();
const double output_value_directional_speed_per_ticks =
price_speedometer.get_directional_speed_per_ticks();
const double output_value_percent_per_ticks =
price_speedometer.get_percent_per_ticks();
if (output_value_speed_per_ticks != input_value_speed_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_directional_speed_per_ticks !=
input_value_directional_speed_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_percent_per_ticks != input_value_percent_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
return;
}
void test_period_in_ticks_bigger_than_non_empty_ticks() {
const int ticks_capacity = 256;
const int period_in_ticks = 7;
const long period_in_milliseconds = 0l;
Price_speedometer price_speedometer(ticks_capacity, period_in_ticks,
period_in_milliseconds);
const datetime time = 0ul;
const double bid = 0.0;
const double ask = 0.0;
double last = 1.0;
const ulong volume = 0ul;
const long time_msc = 1l;
const uint flags = 0u;
const double volume_real = 0.0;
const MqlTick tick_1 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_1);
last = -2.0;
const MqlTick tick_2 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_2);
last = 3.0;
const MqlTick tick_3 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_3);
last = -4.0;
const MqlTick tick_4 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_4);
last = 5.0;
const MqlTick tick_5 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_5);
price_speedometer.calculate_price_speeds();
price_speedometer.calculate_percents();
const double input_value_speed_per_ticks = 24.0;
const double input_value_directional_speed_per_ticks = 4.0;
const double input_value_percent_per_ticks = 4.0 / 24.0 * 100.0;
const double output_value_speed_per_ticks =
price_speedometer.get_speed_per_ticks();
const double output_value_directional_speed_per_ticks =
price_speedometer.get_directional_speed_per_ticks();
const double output_value_percent_per_ticks =
price_speedometer.get_percent_per_ticks();
if (output_value_speed_per_ticks != input_value_speed_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_directional_speed_per_ticks !=
input_value_directional_speed_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_percent_per_ticks != input_value_percent_per_ticks) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
return;
}
void test_period_in_milliseconds_zero_empty_ticks() {
const int ticks_capacity = 256;
const int period_in_ticks = 0;
const long period_in_milliseconds = 0l;
Price_speedometer price_speedometer(ticks_capacity, period_in_ticks,
period_in_milliseconds);
price_speedometer.calculate_price_speeds();
price_speedometer.calculate_percents();
const double input_value_speed_per_milliseconds = 0.0;
const double input_value_directional_speed_per_milliseconds = 0.0;
const double input_value_percent_per_milliseconds = 0.0;
const double output_value_speed_per_milliseconds =
price_speedometer.get_speed_per_milliseconds();
const double output_value_directional_speed_per_milliseconds =
price_speedometer.get_directional_speed_per_milliseconds();
const double output_value_percent_per_milliseconds =
price_speedometer.get_percent_per_milliseconds();
if (output_value_speed_per_milliseconds !=
input_value_speed_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_directional_speed_per_milliseconds !=
input_value_directional_speed_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_percent_per_milliseconds !=
input_value_percent_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
return;
}
void test_period_in_milliseconds_non_zero_empty_ticks() {
const int ticks_capacity = 256;
const int period_in_ticks = 0;
const long period_in_milliseconds = 5l;
Price_speedometer price_speedometer(ticks_capacity, period_in_ticks,
period_in_milliseconds);
price_speedometer.calculate_price_speeds();
price_speedometer.calculate_percents();
const double input_value_speed_per_milliseconds = 0.0;
const double input_value_directional_speed_per_milliseconds = 0.0;
const double input_value_percent_per_milliseconds = 0.0;
const double output_value_speed_per_milliseconds =
price_speedometer.get_speed_per_milliseconds();
const double output_value_directional_speed_per_milliseconds =
price_speedometer.get_directional_speed_per_milliseconds();
const double output_value_percent_per_milliseconds =
price_speedometer.get_percent_per_milliseconds();
if (output_value_speed_per_milliseconds !=
input_value_speed_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_directional_speed_per_milliseconds !=
input_value_directional_speed_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_percent_per_milliseconds !=
input_value_percent_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
return;
}
void test_period_in_milliseconds_zero_non_empty_ticks() {
const int ticks_capacity = 256;
const int period_in_ticks = 0;
const long period_in_milliseconds = 0l;
Price_speedometer price_speedometer(ticks_capacity, period_in_ticks,
period_in_milliseconds);
const datetime time = 0ul;
const double bid = 0.0;
const double ask = 0.0;
double last = 1.0;
const ulong volume = 0ul;
long time_msc = 1l;
const uint flags = 0u;
const double volume_real = 0.0;
const MqlTick tick_1 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_1);
last = -2.0;
time_msc = 2l;
const MqlTick tick_2 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_2);
last = 3.0;
time_msc = 3l;
const MqlTick tick_3 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_3);
last = -4.0;
time_msc = 4l;
const MqlTick tick_4 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_4);
last = 5.0;
time_msc = 5l;
const MqlTick tick_5 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_5);
price_speedometer.calculate_price_speeds();
price_speedometer.calculate_percents();
const double input_value_speed_per_milliseconds = 0.0;
const double input_value_directional_speed_per_milliseconds = 0.0;
const double input_value_percent_per_milliseconds = 0.0;
const double output_value_speed_per_milliseconds =
price_speedometer.get_speed_per_milliseconds();
const double output_value_directional_speed_per_milliseconds =
price_speedometer.get_directional_speed_per_milliseconds();
const double output_value_percent_per_milliseconds =
price_speedometer.get_percent_per_milliseconds();
if (output_value_speed_per_milliseconds !=
input_value_speed_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_directional_speed_per_milliseconds !=
input_value_directional_speed_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_percent_per_milliseconds !=
input_value_percent_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
return;
}
void test_period_in_milliseconds_smaller_than_non_empty_ticks() {
const int ticks_capacity = 256;
const int period_in_ticks = 0;
const long period_in_milliseconds = 2l;
Price_speedometer price_speedometer(ticks_capacity, period_in_ticks,
period_in_milliseconds);
const datetime time = 0ul;
const double bid = 0.0;
const double ask = 0.0;
double last = 1.0;
const ulong volume = 0ul;
long time_msc = 1l;
const uint flags = 0u;
const double volume_real = 0.0;
const MqlTick tick_1 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_1);
last = -2.0;
time_msc = 2l;
const MqlTick tick_2 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_2);
last = 3.0;
time_msc = 3l;
const MqlTick tick_3 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_3);
last = -4.0;
time_msc = 4l;
const MqlTick tick_4 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_4);
last = 5.0;
time_msc = 5l;
const MqlTick tick_5 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_5);
price_speedometer.calculate_price_speeds();
price_speedometer.calculate_percents();
const double input_value_speed_per_milliseconds = 16.0;
const double input_value_directional_speed_per_milliseconds = 2.0;
const double input_value_percent_per_milliseconds = 2.0 / 16.0 * 100.0;
const double output_value_speed_per_milliseconds =
price_speedometer.get_speed_per_milliseconds();
const double output_value_directional_speed_per_milliseconds =
price_speedometer.get_directional_speed_per_milliseconds();
const double output_value_percent_per_milliseconds =
price_speedometer.get_percent_per_milliseconds();
if (output_value_speed_per_milliseconds !=
input_value_speed_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_directional_speed_per_milliseconds !=
input_value_directional_speed_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_percent_per_milliseconds !=
input_value_percent_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
return;
}
void test_period_in_milliseconds_bigger_than_non_empty_ticks() {
const int ticks_capacity = 256;
const int period_in_ticks = 0;
const long period_in_milliseconds = 8l;
Price_speedometer price_speedometer(ticks_capacity, period_in_ticks,
period_in_milliseconds);
const datetime time = 0ul;
const double bid = 0.0;
const double ask = 0.0;
double last = 1.0;
const ulong volume = 0ul;
long time_msc = 1l;
const uint flags = 0u;
const double volume_real = 0.0;
const MqlTick tick_1 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_1);
last = -2.0;
time_msc = 2l;
const MqlTick tick_2 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_2);
last = 3.0;
time_msc = 3l;
const MqlTick tick_3 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_3);
last = -4.0;
time_msc = 4l;
const MqlTick tick_4 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_4);
last = 5.0;
time_msc = 5l;
const MqlTick tick_5 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer.add_tick(tick_5);
price_speedometer.calculate_price_speeds();
price_speedometer.calculate_percents();
const double input_value_speed_per_milliseconds = 24.0;
const double input_value_directional_speed_per_milliseconds = 4.0;
const double input_value_percent_per_milliseconds = 4.0 / 24.0 * 100.0;
const double output_value_speed_per_milliseconds =
price_speedometer.get_speed_per_milliseconds();
const double output_value_directional_speed_per_milliseconds =
price_speedometer.get_directional_speed_per_milliseconds();
const double output_value_percent_per_milliseconds =
price_speedometer.get_percent_per_milliseconds();
if (output_value_speed_per_milliseconds !=
input_value_speed_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_directional_speed_per_milliseconds !=
input_value_directional_speed_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
if (output_value_percent_per_milliseconds !=
input_value_percent_per_milliseconds) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
return;
}
void test_copy_constructor() {
const int ticks_capacity = 256;
const int period_in_ticks = 5;
const long period_in_milliseconds = 0l;
Price_speedometer price_speedometer_1(ticks_capacity, period_in_ticks,
period_in_milliseconds);
const datetime time = 0ul;
const double bid = 0.0;
const double ask = 0.0;
double last = 1.0;
const ulong volume = 0ul;
const long time_msc = 1l;
const uint flags = 0u;
const double volume_real = 0.0;
const MqlTick tick_1 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer_1.add_tick(tick_1);
last = -2.0;
const MqlTick tick_2 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer_1.add_tick(tick_2);
last = 3.0;
const MqlTick tick_3 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer_1.add_tick(tick_3);
last = -4.0;
const MqlTick tick_4 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer_1.add_tick(tick_4);
last = 5.0;
const MqlTick tick_5 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer_1.add_tick(tick_5);
const Price_speedometer price_speedometer_2(price_speedometer_1);
const double input_value = price_speedometer_1.get_speed_per_ticks();
const double output_value = price_speedometer_2.get_speed_per_ticks();
if (output_value != input_value) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
return;
}
void test_copy_assignment() {
const int ticks_capacity = 256;
const int period_in_ticks = 5;
const long period_in_milliseconds = 0l;
Price_speedometer price_speedometer_1(ticks_capacity, period_in_ticks,
period_in_milliseconds);
const datetime time = 0ul;
const double bid = 0.0;
const double ask = 0.0;
double last = 1.0;
const ulong volume = 0ul;
const long time_msc = 1l;
const uint flags = 0u;
const double volume_real = 0.0;
const MqlTick tick_1 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer_1.add_tick(tick_1);
last = -2.0;
const MqlTick tick_2 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer_1.add_tick(tick_2);
last = 3.0;
const MqlTick tick_3 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer_1.add_tick(tick_3);
last = -4.0;
const MqlTick tick_4 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer_1.add_tick(tick_4);
last = 5.0;
const MqlTick tick_5 = {time, bid, ask, last,
volume, time_msc, flags, volume_real};
price_speedometer_1.add_tick(tick_5);
const Price_speedometer price_speedometer_2 = price_speedometer_1;
const double input_value = price_speedometer_1.get_speed_per_ticks();
const double output_value = price_speedometer_2.get_speed_per_ticks();
if (output_value != input_value) {
Alert("Test failed in line ", __LINE__, ".");
ExpertRemove();
}
return;
}