0100100000101011110100101010010010111010111110101100111001100001000100100111101111000101110001111110101000100110111100011101010011101111000110001010001000011000100110010010110101001010000110100110011110101101000111100111001001100110010000001110111010010011110101111110010111000000001100011110111101111000011100101110001100110000111100100101000110110110101000000000010100010101100110101101100100100000 1110100110101001101111000011010100011011010010011011101100110010101001010001110010010110101011110101110001000100100110100011101111011011011011111011001010111011001001011110001111011001011101001001101001110001011111000011110001000100110101001000011010000100000001111001000101010100000010001101110101001011111101111001001000110111000110000111100000010000001101010010010110011011010111111110100010001000 0001100000001010110001010101011000001100010100101011101000101000000101011011010101010111001100011110100111111101001000100101011110110010110000101001111010001010011110010010001101110111100011001100110011001101101110000111001111101011001010100111111111010101110100011111100001110011111011110010111111110110111111011111001010011110010110011101000110100010110010000100100011001101101100111000000100011011 1010010011111100100001001111101100101011001000101100000100100000111100011000100100011011101110111101100011100001100101101011110110010000000011101010001000110110011101010110011110100000111100101010101111111010101111100001100001111100010000010110111010010111111010110100110011101110001010101101001011010001010001110000001011010100000001000110010000010110101110011110101111010110100110000001100110000110 0111110101000111011010100011101000010000111000001001100010100010110011100110001110011110010010100011010000011001101000011011000011000011011001010001011010000010101101011011011000001000011010011101100000010010000010101011000101000111111111100011111110111001001011110010000001010010101001100100110100010010000001110101101111001001010101111001111111110000001010101100100011001111010011101010001101101011 0011101000100011111010100101101100000000110110001000111011100010110100100101011001110110011110000110110110010000010001110100101000111011011001010000010101011101101101101101101101110110100001001100110111100011000001110111110101101011000110110001110111111110000011111101000001111001000101011101001110011010111111010011101111000011101101111001101010100101010011001110111100011000110101010010001010111101 1100110101001000000111110001000000000000001110110110110101010101110000011101011110100111010111010001111001110101001111100110100101001111110101100100110111011110001011011111000101001010010111001001111010011010111100111100100000110000111101001110101011010101101101000011000101100011110000010101110000000110110000101101000100000100100011001111110000100101011001010000110101100011111101101010000111100100 1111110110100100110000101011111111100111110000001111010011011000010111011000110001111110001110110100010011110100001010111100101101000111010101001100011001100000100101111001011110111010100101001100111100101000001011111101000100010101111010110100110101011101010110110100111001110110001011101100111101111010001001110011000110011101011011100001011001001111001100001001001010100110111101000111101110100100 1110100101000111001010101001110110001101110110000101100010000100100110000001000011001010011111000111000110110010011011101111000101001001011000011000110010111011100010100000110110111000011001110010101000101000100011001000111101101010101000101011000111011100111010101011000001100111011011101100101100000110000111011011000011100001011001100100001011111001111001110001000111111000100000001001000011000101 0101010000100011010010110101011011100010001000010000110111110011111010011010001101101100011111010111101111010011111000010111111010010010000111011100001110011010110101110010001000111110111000101000101101111100001111101111101100100010100111000111100110111110100110101000111100101110111100111010100000010111101111111111100001110000110111001110010110110000110011011001110110101000110011000010010000010111 1100001000011110100101111111000111111111111100010011011010110110011011100001000011001110001111011000101100100010100011001001001001001100000101010100110100011010111100101100110101110010111110100011111100001000111100101000101001010100110101101101010011011000111100110101111100010101010000010001101111100110100000110111011001101101001111000111010100000001110010010110101010100101001110000111010110100000 1111011000100111100011100100001011010110111100010111101110101110000011011101010001100101001000110000101001011100001011100011001110101010110000010100001110000101100000100011000111100100010010111100000110011101111001000011011000101111011011100010001101000101001110111000011000000011010100000010010000000011001010011110011101111110010101001010100011000000100011101010111001000101011110001011011110100010 0111110011111101010001101110000011010011011111101000001000110101101011010100101111011101011011100110110010011111001010001110011011011101101110001010001110100111101001100010100001110100111001101001110001010010100100110100111111010111010001011100101110010100110010101110000000110110101011110100001100001010111000011001010001001100000100111011100000101000011000001000100100000100100011101001100001000001 1111100111001001110000000110110010010000000011111011111101100011100000111100010110101100111101111001101001011010111011111010011000000010010011111110000000001111001011011101110100000111011110101011101101011110111100100011000101101101000101001010011110010011101100110000100001100111000001111110000000110111100010001100001100001110100011001011011101100101001001010111101010000100011001101001000001111100 1111110001111110000000100110100010011000011000010111010101010100001111010100100101110001110010110110000100111011011011111010000111001111101001000000111111010111110100000011111001110011010000010100100000110101111010111101011100001001011001111011000011011010110000000110101110110000010110001010001001001110110110010100100111110010011001101111100110111010010010001100011111010111000101111110100000100100 1000011101110000001000111110001111101100110111010001001011001111111110000001101000010001110001001100110100000010111110110000101010111010000101111111000111011101011110100010111100101101101000110011100101111011011111001011001010101111001101101100101000001110001010111011001001011010111110011011000100101011111101001010011010101010101111011100111011010110010011010100100101000110100001010000101101110110 0000110001110011000110000100111110101101000100010100010111000010111001011010000011011111001101001101100111000010011100011110100000100010101000001100001011111101100101100101111000001110101001011010100111011010010010100110001110100001100010011101001100000100011011110001000010111000011101000111011100000111001110110110110111001111111001001000011101101111001010010001001100010000110110011010001111001001 1011001101110011010001000000010101101111010100110101000010011111110111110110001010000011100100000010110110011110001001111000111111011001011100001001001110101100010000000001100001101000110001101010110101000100011100100100111001000011011000000000100000000011011111010100100101110011101001011110100100010111110110010110101101111011110100100101000110000111111011000010001101010010000100010011000011110011 1110111100100000001010101001111001010100011111100000000110011111100110011111001101010101000111010010010010011111100011101111001010110010110001000110111111111111110001000100111101101111100100001101010101001100101101111110100111011100110011110101100010001000110110101010111101010011100011100011001010001010001100110110111101111110110010000010110101000101001110111111111001100100010010110000110111101011 0000010011000010010111010001001101100000000111101100000111010000010111011001010101011111100000110110001010011111111000011100111001111101010000110001011001011001011000010011110011011001101011100011110010010100010011111101011111001111101001111001100101000101011100000110000001110011010100110111101101111111000011110111101010000011010001010110100111000000011000001001000110000010111110111011011111000000 1110000101111000000011111101010010111101000110110001010000111100000010111011110100010011110100111001100100110011001111101100011111111010110010110111100100110111110000100000000100101111011111001001100110100000110110100101100001000101100010100111111001110000100111011101010111001110111000001011001110101111000110011101000100111011110110100110001100100001100001000110111111110110100100101111000101101111 1001011011011011010101110001011110011111100010111100011110001100000101000110000100110001101100010101000100100011000100010100110011111110100011100010011111010110110100000110111011010011001011010100111010111000111001001100101100110010001000010010001000111011110010100010000000010111111111110010000010010101011010000001110000000011100001110010110010000111111100110001100111000010111001001100000001011111 1010010011011101101011001110100001101010010011110011000000011110001000101101110011000010000001110100010011000000111111000000101010001010110010011010111011111000000100100111001000110011011101001011011010101001110001101100010001110001111110011101101000000111010100011111001010011111111101010111001011101100001000111011101110000101010010010010001100111110001101001011111101001110000111010111010010011011 0100111111010010010011010110011101101010011000100000100100000011111101111001010101110011110101001010011011110001100100010101000011100001110111100101101010111001000110101001010100001110110000000110110100101000100101110001000111111011011101001101000010000100110011011100111110010000000001010000001010000000100101000111000011111001010000000111010011111101011000111110110110101001001100010001101001111010 1001000100000110011000100101011000010010011111010110010010100001011111000110101011110011010001011001101010011000000110111001101000001100111100100100000100000001100010100100110000100110010100010000100110111000100001111011111010000011011111101111100110010100111101011001010111100011001000110101101110001001000100111101011100011010010100010110100000001111011101111100101100010011001000001001001101010100 0100011011111111000011001101101010111100001000000111111001001100000100101001000010010101111110111000110100000000100111011110011011111000000011010011100001101100100000011011010100111110111100110111101000000000111101101100110000001010111110010111111101111111010101011101011011011010100011001111001010110000011001110110111101000111110011001110101000101001011111100011001010010111110001000011000001111110 1001101001011111001110111110000100001100101101000110000110001010010101001101001011010010101111010100000111011011111101101101101110011110011011000000011010111100011111111100011111111001100000110010100010110010010010011101110011010111101100011001111010110101001101110011110001101000110001011100111100001011101011101011011110111110100100011111110011110101010011100111110110111001010000100110111011010100 0000111110010000100000000101011010001111110100111101011001001001011000000111100100010100011001111011111000100011110100000010001111100011011111001010001100000011111001011110110010111110110001010101100000111011100000101011100000011111110111100111100000011011100000111010110010101100100110100110001001010000011010011010000011110111010111111001011011010000001011000011011000101000000010111100011111111110 0111111010001001000111100000001010000011100111100011001111011010010111111110111111101110001000011101011111010010111010010111111010100001000011111100111111100111010010010000111010100100000001111011100011001101001010100100101001010110011010111010011000110110000001110001111100100100101000111010110011010111001001101110110100101110100001011011101000011001010010001111011100001110000101000011011101101000 1001100111100111011101110000100000111110110110100010111101111001011001101110001010101110110101011110001110101111011000010011001101000010000010000100111110001101101000101011100111110011111011111010010111110000111000111101100000001110001111010101100111110100011010001001100010001111001100110101001010000000101110100101000010010010111001111010101101000110100011001111001100110111011111101110100100111001 0000001011011100001101111000010001100001100010110111100011100011000100000011110111001000010111101010110110000011110101010100110010001010110100001100111010000101001011000110111001011011110011111101101111111100101010001011011100011110000001010010010111111011111011011010000111001010001111100110011011010000110101101100011011100011110001001100011001101010110101001000010110101110100010000101001000010000 0101100001001000101110111101110100100001110010101001110000000110100000101000010001001011001010011111100000001011000011001110111100100000000001100010010001110110010010101110110101010111010010111100101110000101000101001111111001100011101110101011111111110001111110011011010111011110110011011010100010010111111101100011101010101100000000010000111011010000001000000010101011101001000110110100010001100011 1101100101011001100011110000111111000110011011111111110101110001100101000000101101100011111111001011010111001011111000001100010010001110101011000011100110000000111011010010111000100011110101011110101010010010010111101010010011110001011100000101001101100110011011000000001100011110100110001111101101101110011101100011110100010011000111000010100110101111110110111100010111101011001001000111000100100010 1111110001100100010110001011100000000111110111111001000110000011000011101100111101001001100110001111101110011000011000010001111110110101100001011110100101101110010110010111010000011111001001011000111010010111100111011011101000110001001000000101010101001111101100010101010010100110001100101011011000110110001101001101001111101000110110110011001110111100001000011011111110100011011001001110010000011011 0001001000000011111110101100101110011001000110000100000011111010001001101001101001010100000100010110000110111010101010000011010010100110010001011001000001101011011101011010010001100001010011010011011000111110111000111001100000010010000111101100110001100100000010100010011111001111011010001000100100000110000010010000111101001000100011011100111011110101001001100111101010100111000001001001111100001110 0001011001110001110101010111011000000000011010011010100111000001010011010100100101100110101011110100111011100000101100010001110010001001000111011001010111111011000011010011000110000010001100011110101010101111010111101010110111000100010101101101111100101010000100111100010111101010000000011110010001000100001011010100010111100010110001000010000110101010011111000001101111011101101000011111010111011010 1111111111101011101111111111100001001011000011000111111010011011000011110110110100011110101000001000000011111111101011000110000001101011111100000110101010010111010010101111100111001001011000110111111011101011111000110000001011111100100110100001010100011011100001000110111101001001101011101110011001010111010100001001001010011100100000001110000110100110101101000111001101111101100011011011101010111111 1100100000101000100100010001111010001111111000110010101100010111101101100101110010011110010100010100010011100100000110011000000000010100011101100111011101001110101000101111010100101010010101010100011011100010100000001100000011101101000100110100110000001100000101001000100110111000010111101001001101110001110000011110110110101001001000101011111110111110101010101010101111101001010111000111011000100000 0000100001110111000110001110010110111000000010001110101001010010101010001101100011110011000011010100001010011001111100100001111101000001101000001001111101001001100100010100101010000101110011000101101001100111011111001100110110110101110001101110100101001101100010101100111111010111010010100001110010010100111111000100100011010101001100000011011010011010100001111111010101100101111100011110001100111101 0100111100110000100011011110011100011110100110000100100101111011000011100011000010001100011111010011100101010111101111010100110110001010011000011111110100011010100001001000100111100001010001011101110110111010101110001100100010110110001101011100000110010010000101011001100101111110111111000001100100110010011011000001100001011101111111100001100010101000001000001101000000110001001001101110110111010010 1011110011100011111010101010011111001100011101001010001010011110011001000011011011101110000011011011001100100000000111100011001010100101011001000011100111101000001011011011110110000101000111100101011100000110101100101001110011110011001100100100111110010111000001000010100100101110100111001100011100100010011001101110100111000001010101110000000100110110100101010010001101100011010011101011010110000000 1111101010111100101110010001000111100000010110110011011111000100010011010011111010000100010011010110000011001001001000010010011010110000000100101111001111111111001011010010010010111110000101000110001001101100000010111110001101101000100011010111000111110100100010111100100001100011110011001100001000100101110011100001011110000111111010101101110101001110010011011101101010010011100100100010100101110111 1110100111001101101001010110010110011011101011101001101010100111100100000111101111110010001000111100101011110100001110111110010010110000011100011110010101111101110011101000101011101110001000101010010001001011110100100100111010010011011101101000011100011110011111100110101000000011110110010110111110101010101010101100000110000101110101001100010110000110100011011011110111000010000010000111010100101110 0000011010110000001100101010001110100111101100010011000110001011000010001011101100011101110110101111111010111110100000111110011110010111110101101101001010111101011101011010011100001110010110101011011101000010101111001111011000100101011110110111010101001000011101101111110101011001011101110100010001111001100001001001100011011010100010001000001100101100110010000011101111101011111100101001100011011011 0001000110111010011100110011110110011110011110100000011011110010101010100010011011011111010111011010001110100100100001101010000010110111010111100000100000101001111000100110100010110011101011011111001010000011111001010000111111101101111001100110001000000100011111011010001011110001100011111110011000111111010011010001111101100010001000100111110001110011001010001011000111000100100010110101010110010010 0001000010011111010010100100000000011110001000001000000001101101111010110101010000010010100010011111111010010100111010110110110010101001100001101010001101010100010101011000011011000100010111110111101110101111001101000100001011011110110000111011001110001011011100110110010001101011110111101000010110111100000010100011111010010100001011110011111011001111100100010110101100001000000111010000010110011111 1001100000111011000001100100001101100111001010011011101100001101100110101011111001111110110001100111000010000110000011111010000101000100001111000010100011010000110111010001101000101101111011110010110010101011010101000001101010111101111000000000001100010010010100000011001000000001111011111010000001111100011011100010111101101000101010110110110001000010001001010000101011110001001100100111100110111000 1110010100111100011111100001101010010000101100100010100000000111110111101110001001000110010000100100001010001010100010110110101111111000000000001001001111110100110011100001011010111110101011110100101101000010111101000011000001010001100100000011000001010110000101111101110101001011111001001000000111101001100111000111101101100111111000111100101010110100011001110011011000000100110001010000110011100010 0000100001010110100000101011001101010111111010100111000010111000011111010011111001100110010011010000100000000110010001101010111101010100011111110110111010110111000110011101101011000110101001101000100110111100011111011010111101000111001010110010100001110010011011000011001001000101000010100100100110010100101010101010000011011101101011101101010110001001001100101011001100111111001101111101010010001101 1011110000001111111000000111100110111001101110111111001001101101001111100100001000100000011110001111101110001110001010110010010011100001111110001111111000000001101111100011011100111010110001010000111000010000001101100110011110001101001101000110010100011011011110100101000111110010011001111110111001100100110110010010101110000101111111010010010011100100010010101000110111110110101000111001100010100101 0111101000001111011011110010110100011000011100101111111101000100011001001101101011001010010100011011110010011101000111010110100001001110110110100101000110100001101001010100111011101111011001111100101010001000011100101011001001111101100001011000100100011010110111110111101111100110010001100000101111011010001111101011100111010101010001011011001010111000100101111111111100011111011111000001111111000010 1011000000000100011001010100100010001101011110010100111111001111001101000101000100001000101011010110010101011100010101100101000000001000110000110101011000100100110110111000010110001110011110010101010111011011110100100111110111010100001011101010111100000001101100000100110100100011100001111111110100111001001100001000111001011101000101001111101000001001001011011111101111101001011110000111111100111110 1000011111001111011011000110100101101111010110100001101010110001010100111100111100001100001011111010011110100110111011011110010111111000111011000110000001001110110011111100111100110101010001101000000111010011100000100111101100111110101101110101011100001001011100000011110000110001101101100011011001010001101100101111010111001100101011110111011100110011100010101001001000111111100110011111100110100101 1010010101100100001001110011000111000011101010000000001100001110000101110110101111000111000111011011011000101101101000110111111011100111000010000100101110001001010110101000111011011011110011111001001001000101111101111000011101000101000111111111011011100000011111001101010111011111111011001101110001111001111101010000101011010101110010110110000011011111001011011101100001111111011110111000110011000000 1011110001001100110001111101110010100011000001011010111010111010100010100100100110110000001111111001110100010001001100101100000011100101000011110000111011000000110001011000001001111101000001100101101111010100110100000110110010011001000001010111000100101101111000111010011001100111000100011101000101110101010100011001001010101110001101101010011000010000100000001000111110110110001001001001011110101101 1001111101101110100110110110110000001100110111111110001011001001011111111101000100000001001010000010111001101101111011000111100011111100010111100111000100010010010001011101001010000011001010011101010100001110110110010000000010001001111111000110110001000011010111000011110101000010100000010000010111011001000110011100110110011111000110111001000100100011111111111100001111110010100101011100001101111000 0001101000000110110000101000101101111110101010100001110101011001001010000111111111100110001010101100110100011101011111011010001100000000101011001110111110011000110000100100100000100000000010100111010000010110111010011111101010001011010110011001110101001001110110100101001100110110011010000010100100110001011000000101110111111000000001000110001000101011000001010101011011110111010010001100100100110010 0001100011111000100010010000011111011011000101000001010110011011011000110000100110000101010100000101001111000101100000100100101011110111011100000010011010100010100111000011001110000111110001110001111010000101111111111000000110000010010011001111010100001100011110001100101011000010101101000101111101110110010100000000110111101111110001111000110000111100010000011111000011011000101101111100011010000010 1101010101101101111010100111100110110001010111000010100110111000001111000101000101100111111001011000100101000100011111110101010001010010000111001010010000001100100000011001000101011000011111011100000001010110011100011110001101011100111100010110001100001011010101011101100110010111110100101101110010011111010000110110100101010001011010110110101010110010110111100110100111100110110101001001111110010110 0010000101001011001110000101100100011110010101011101111010110110010110011101111011100111011001111001010001011011100010010001111011111110011010110001000110111110100100011111001011111101110110011100001110010101000011111000011001011011110011010100001110010001111110100011010110101111011000111000000111101110110000001000011000000101011010101011111010110000101100101000000111010111100101111001100101001100 1010010110000000110000101111100100000100001110010101011010100101000000100110000000111110000011000111110001011101101111100101100110111010100101010010101100111110000001000010001101100011011000000001101000010000100100000001010111110001001000110000010010101001001100010011100100011010001101110100001110011010011101000110111001000000111100000101110010101111111010001111100100111001011110010011000100101011 1110111100111011101101000010010000100100110110010001001100111100110101111010111000110101111100101111101111010100010100010000001011101100000001010010101000101110110001110111100101111011010010000001110000001100011011101000001010011101011001110010110001010100101110010010000001110100000111111110111110111101001111011111001100101110110110001111111000100101000100011000001001110010111100111101101000100001 0110110010011001000010101100001110001001011101001111110000000010110100000010110001001010111010000011111110000001100101001011010011000011100101101000001001101010001101100011011111100110101100010111011101000110000000100010111001011011100011001100110001101010011010101111111100100101111101001001100110101000101111111001111101100110000100100010001011110100011011101001010000010010110000011010101101000001 1001101110010011010110010111110101010001101110011001010110010111011100111011011101101000001000110011000011111000110011101110001101110110100101000110100111110101000010011110111001000000111001110010111001111010110101001111101000111000101011110001101111101011110011101101111100110100110011111011000100010111101100000101011010111110110110011110000111101000010000001001110101101010011101010111110001110110 0111010011011101111111000111110011001101100111101011001110001000100010011001000011110110111010001100110111011010111000111100001101000110100111010001100110110100100111000000000110111011000100010000001001011011111110010101110110110101000000000000000101010110111000000111001110000111010111101110011011100101111111001111010100100101001111011111101001100001010111010111111001000101101111000011010110000010 1111100011010000100001110100010101011111101001010010111001001110101100011110010011001001110001001000001101101110011101110010000110110001100110111100111111001010110001101111010011110011111110000101101010110010110111111011010101011000000000001000100001110001101000000110011000010111101001011101011011001010111000011110011001001010100001110011100101101010101000110110011001111001010101101011010010000101 0000111101010000001110110101111011110100001110101110101000110001110011010010000110111101101111010010101000100010000010010011111011111010110110011110010001100111101110110010111101000001001000110010000110101110111000101111011011101010010110111010011000110011010010100111101111100010010110100001010100001100001100011001010010011000100011000111001001000001111010010011001011110000111001010111111111101111 1001011011010010101110000001010110000111011110100111100001101011001010110000000010001011110111011000101110101111101111110000011100010001000010001011100111000010001101001101111101011100110110000101011010000000001110001110110101100000010010011111000011000000110101000100000111011100000011001000001111010101101001101101010110001011101010111011111100001111101000010111101000001011000100100000111010011000 1101110111110010011001111011000111010101110111100101000111010001110000011110001111100000110001001010001101100010100101000000110111100111011000010000011100011100111100100100101101010011001110110110101111111101001101111110000000101100010000010010100001000110110101101101011000110111011100011001001101100010101001011000100100010101101011010011000111001011100100111000100001111111010101000000111100010111 1011010100101000111000111101111101010011110101101011110001001011100001000100110001110001000000010101111000001001001110110110000100010000101101011001000111001000111011011001100110001101011110010110000011001010110100100011010001001000000011100100011010111001010000000111001010000100100010110010111111101011110110001110000001111101001111000000000111111011100100011100011010111111100101001000001110101010 1110101010100010110101101000110100010011110111000100011111000010111110100111000000000101000110101010110001100101010010110101001101001010010001000011000101100100101101110000100001001001001011111101101110011001110111011110101110101101001001111100110100111101110010111000000111110100101100011000000110110111100011100110111101101101001100010100001001000111100010010011111000001110011100100011010110111001 1011010001000111000001110101100101000001000111011010111010010011110111111001111000000001011110101011010010000010101100111100000101000000110010011100111111110110100010001111000011000111110111101000010010101100110111101000011000110110100110000110100110010111001010000010101000000110101010100011000000011001101001011000010010011000110111011100100011000111100101010001101111101001000010011100001010100011 1000000001111011001101100111000110111001000001101011000111110100110011101011111000011100110110101001100010110010101110011100100000010001011001010000100010010100010010011000100011011111110010101110100110100111100100100101100101100001011010110101100100111101100001100110011100011010001101000100111110111101000111011100001111101001111001011110011110011010001001111010100111001000001100010010101111000000 1111101011000100111010101111101011011101000001001011101000001010010000111111001011001010100011100010010001011001010101110011000011011001110001101111111010001001000000010110111010001100100111011000001011001010001001101100111100010000010110101111101000011101101000011000111110101111001100111000001010111010110111010001001111001011110010001110111111001101000010011000100100000011100000011010011000100010 0110001010011101000111010110001110100011001110011000111101000010100101111100001010111111011100111011101111100011110000111011010000110001011010110101011101011110100000100001010110010001100101001011100011100101101011011000010101110100101011001111011000010010000001101110010101001001100000010010101111001100101111110010101110011100111000010100101010100001101000000100010100011100110110110101100100101011 0101111011010110001000000111011111100000010111000000000000101010011001110010111000110101010011001111010000111100101001101111000100111110001111001101101011011000101101011111011001110100101101111101001100000100100100010100101000110101100000100100000110110001000010111111100110010101000110100000010111100110000001111000000101000010111001100000001011010011011010011001100000001111010110100000100101001010 1101110111111011001111011000001111010000101100101101010001001001100001001001001001110101111000000011100101111000001001101001101001101001110110010110010101110001101110001111110011110101100100111010000001010111001010111011111010010011011000110010100000111010001110110110001100110011111000110011110001001110010000111010110000110101010111001111010010101110001101001110101101011101100100000110111011100111 0101100010001110000100110011101100000110101001101011000000000010010101111000011001001111111011100100010010101100111111010011110010000001010001110010011000010001101110011100010001100010101011000100010100001000100111011101110000010111110110100110110100100000011001101101000111011100001110110011001001000011000011100000101000000000000011010100011000101110101001100000011111101100001100100101100011111001 1110110000000100000101001110111010001111010100100100101100110101011010001000011000111000110010101101000101011110000010111100011110001100001010010001000010110011100010001101011001011101010101111100000101000001000111100110010100111000111101000010100101011010000000011011111101110011000000100011101111100111101011110101100111111010101101111010100111111100101111111001100100101101011011100100101101010001 1100000101100011011100110000100000100000001010100111001101101101011001001110110101101000001111101111001101011110101111011101010110111100001101010000111100000101010001011011011000001000001110110101100000000101100001111101010000100100000010111001010110011111010100001000001100111101111000010000000101000000001111001000100010000000100100000100010001011111011101101100100110100000010110101100000000100101 0101001011110100110100100110111110010110100101011001101011011010000001010010011111011001100011100100100100101011001000011011111111011000110010110101110010111001101001000000100111001001111000110010010110111100001000001010001100111010010001000111100101011111011111101101111100111101100110010000010000111000101000001100111110011010111111011110011100100000101101100111100110100101100010101100001101010000 1010101110100110001001100010010011001001000111010110110010010001000000110111101100011100101101010010101101100110101011011101100011001101010110111100100101101100101100010000011001011100111100101100110010110101110010001110000001011110010001011111110000101001110111101001101010000001101110001111100011000000001011100101100100001110110001100010001010100011001110110101111011110110110100110010010100010101 0010010101011100101110000100111010011010101111100101010101101100111110101111100001000111010101110101111010111110010110000010100100010101101100111011101011110111001001110110001011000101000100111111000110100000011000101011110010011001100110111101011100101010010100101101101111010101010010110001001111001110011111111100110010101111011010010111000001111010100110000001011001110101010100100101010100011001 0101101111001100101110110110000111000000000001111100110010001000101000100111100110011100101010011101000001010111010110011000101011111000100110001001010011011010111011100110010111010111011100010010111011111110100111101011101010000010010001000101101100111010100011010001110100010010010110100100101100110101110100100010001110100011001101111011101011111010111110001100100101010100010001011100111101000111 1111010001111001101000010011111100001011011110111000011011011110111001100101111111000000000011001000001001001111100010101100010111000001111001010111001100011111111010100101001010101101000111100011110001111001001100011010000000110101010110110100111110001101101011001000100101011010100101101110110110101011101101100011000111111010100110111100001110010110110100001111001110101100011001000010111010000100 0001111101011011100100011001001100100111100101010001001101001001110000111001011010011001010001010110111010010100110001011100100010101111101010111001000100110110101011110110010101000011001001010101001000101101101100111101111101101000101111010100110001110010100111001010100001011000010010110111010001111001001111100111101111010100001010010010110110100000101010101011000100111000000111110001111110110011 0000100000001100110011101111111011110011111110111100001100110001111101100000000110110110110111011000101110001001100010111110110111111001101110000111101001100100011000011110100011110000111000110010011101110010001111110000000010111100100100110011100100101110111000100011101000100011110111111110001011001101101101001111010010111111100001100000000011111100000011010101110010011101111010011010000100111000 1110101101101100011001111011001111111000011010100010101111011100100110011001101000101101011100100011100111011011000001111101011010101110001010011101110000111101011110010111110001110101110110100101111010111101101010001111010100001000100011100010001000011010000010110000101010101000010000100000001111010000000111100011101010110100011001011010010111101000000100100001000010101101001001000101010010110101 1101100000101000001001110111100001101011010010001101100001101110101001010111010111000001011101110000010111001100100011100011010101000000011101010000110100101010110100000111101110011011010011110001101001101011101011101010110000111000110001100011010010001111001000001100001111011111110011110010001000001100101011101010100110111001011001000010101101001111010100111010101010101010100010000011101000101100 0100110000001011001000000010110001011111011110000111011011001000101010100010011110011111111111101010001001010101001100001100111110001100100000011000111011011001110011110001001110000100000011101100001011010010110111001010000111011111000001110101011011001101100111100110011101011001111011000110111000111101001011010000111101010110000001101100110001101010001111111011001111111101011011111111101111010011 0010011100011001110101110000011000100110110001110110000110100011110011010101010100000011110001010001100111011111000001011100011111111100000000011010011011101010001101010101010001100101010001001100111111110100101111010101010000110111100111100110000000010001010101010011100001100110110111110011100110001010110011000001011111101011101000101000001101101111000000101011001001010110000111101001100011101101 0011111011110110000010110110011001111011110100001110010010111010100101000111010100110100010010100000000010000000000110011010010011010101001011011011111001011101101101100110001001000001100101011100000101100011110000011010001010011110000111111100111111001110000011101001110111111101100100101011101000101000110010111101101001101010110110010001010110001110000101000110001001011001001100010011110101000001 0000111101110001111010010001011101101010000100001111110011011001110111100110110010101011001011000001011011001000100001101011001010011000101010011010111011000000000101101101111001011001010100001100001011001011111110001001101111110001110111101000000001011111000111010111011111101001010100110101110100011011101111111010000101010001010110100001111011101101010001100000010000101001100000011001011001101001 0110010100101001010110011100100101000101001000011110110011010001011010101010110110110011100000011100110010100111111010010001010010101101111000010011001000000101001001000101110110010100001001111011000011100001101101101100011100011001101101001000110110001001111101111010000110101111010000010011110001001010000010111101010000111000010111011010010111111111110101110111010111111011100000101100100001000110 1000000001011111000111001000000001111011100011100100011010110010111001101100100001110011011011110000111111100110101010011001110101011100100001100101100001101110010000001001001101001011110110010111010010110001000000001101111001001111110100000101001111000001011111110001011011000001000100000010000000101100011101110110001111110110100100001110010111100010111111110001011100010000101101000001101101000110 0001100111000001111001001110000111100010110110001100001111011010001111000011001011011100001110111011011010101100011110111110110100110100100001111010110110101101101101011010111000010101001101011011111101011010000110111000010110000111000000101000001101010101001110011000110111011000111000010000011110101011001000110001001000001111010111101110101101001101000110010100010000100101111100101111000001010010 0000000000100101111000101010110010110100010000011011111111110000111001000001101001010100101110101000011100011001011111001010001110111010011000001101011110001001011111011001100100100110110010100001001110110111100100001100011000001110100011111100010101101100110000110011000001011110101101010000011111110101101100000000000111101010100110011110111100100110100100111110101001101110010010000101011001100001 0111110110011111111010011000111011000000010100010101011101101101111100111001101000011110110100101010000101101111011010111111011110010001001000100001011001111001110100101111111011010000100000101110110100000101110100001101100100110100110110101101011100111111110100010000110011001000000111000001011101101010010101111100000010100011111100001000011010111010000001001111110000010111100001111011001011011110 1100110110111110000111110000011111011100001101101011101101100101010110011100111111011000110010000100001000110000101101010110000100010000110011000000001010011000101111110101000011101100111011000000101001000100101101111011100000110000110001101001101010010111011001111001100000011011100101101001101011110110111001110000111000110011101101011101101111110111100010001000010000100101111001010100111000101010 1001111010110110111011110001100100001011101100010011101110000011111011000111101001011111111101010001000110001000100111010100101011101100101111110001010101111111001010100101000111101101011001110100111111110111100110011100111111100111100000110001011111111001100000001001011011010110000100000011110101011010011100110111110110111101110010001101111101111010000101010101100000111110001010110001001110011100
cTrader Algo

【cTrader】スクリプトをバックテストで使ってみる

1/2/2021 1/8/2021

5年以上前の記事です。内容が古くなっている可能性があります。

スクリプトの動作確認をしたい

cTraderでもcBotのOnStartにだけ処理を書くことでスクリプトを作れるよ、という話をしました。

しかしこの作り方だと、バックテストのビジュアルモードで試してみることができません。実行と同時に一瞬で終わってしまいますから。

単純なスクリプトならデモ口座のリアルタイム環境でちょちょいとテストすればいいかもしれませんが、少し複雑なプログラムを作った場合はさまざまな相場で動作テストをするためにビジュアルモードを使いたいと思うのは自然でしょう。

今回はスクリプトをビジュアルモードで動かすための作り方を紹介したいと思います。

 

バックテスト時の動作だけ変える

やり方としてはバックテスト時の動作を、リアルタイム環境での動作とは別にプログラムすればいいのです。

IsBacktestingプロパティを利用して、バックテストのときだけは、起動後ボタンを押すたびにスクリプトの処理を走らせるように変更します。

(同じバックテストでもビジュアルモードのかそうじゃないかかでちゃんと振り分けたいという丁寧な方はIsBacktestingではなくてRunningModeプロパティを使ってもいいです。)

ボタンの使い方はわからない方もいるかもしれませんので、以前作ったAutoFibonacciを例に一つずつ説明します。

 

スクリプト本体を別メソッドにする

OnStart内に書いたスクリプト本体の処理を丸っと別メソッドに切り分けてください。名前は何でもいいですが、ScriptMain()とでもしておきましょうか。

最後にStop()を書いてる場合は、これだけは消してください。

//-----------------------------
// OnStartの中身を別メソッドに移す
private void ScriptMain(){
  //内容省略(OnStartの内容をそのまま書く)
    //Stop(); この行だけは消す。これが残ってるとボタン押した途端バックテストが止まってしまう。
}

OnStart()内ではScriptMain()を呼び出してからStop()を呼んであげれば、動作は今までと全く同じです。

 

バックテスト環境でだけ動きを変える

続いてOnStart()をバックテスト環境でだけ動作を変えるように変更します。リアルタイム環境では今まで通り、ScriptMain()を呼び出すだけですが、バックテスト環境ではScriptMainを実行するボタンを作って、チャート左下に設置してます。

//--------------------------------
// OnStart内でバックテスト時の処理振り分け
protected override void OnStart() {
    if (IsBacktesting) {
        // --- バックテスト環境のとき
        var button = new Button { // ①ボタン作成
            HorizontalAlignment = HorizontalAlignment.Left,
            VerticalAlignment = VerticalAlignment.Bottom,
            Margin = 20,
            Text = ToString(),
        };
        button.Click += (_=>ScriptMain()); // ②動作登録
        Chart.AddControl(button); // ③チャートに設置
    } else {
        // --- リアルタイム環境のとき
        ScriptMain();
        Stop();
    }
}

ボタンをを作る処理は、①ボタン作成と同時にプロパティ設定、②ボタンの動作登録、③ボタンをチャートに設置、というだけです。ボタンの場所や色変えたければnew Button{}内をいじってください。(参考:Button)

 

完成

これで完成。コード全体載せておきます。このままコピペしてビルドすれば動きます。バックテスト(ビジュアルモード)では左下に”AutoFibonacci”というボタンが表示されるのがわかると思います。

using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;

namespace cAlgo.Robots {
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class AutoFibonacci : Robot {
        [Parameter(DefaultValue = 25)]
        public int Period { get; set; }

        //--------------------------------
        // OnStart内でバックテスト時の処理振り分け
        protected override void OnStart() {
            if (IsBacktesting) {
                var button = new Button {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment = VerticalAlignment.Bottom,
                    Margin = 20,
                    Text = ToString(),
                };
                button.Click += (_ => ScriptMain());
                Chart.AddControl(button);
            } else {
                ScriptMain();
                Stop();
            }
        }
        //-----------------------------
        // OnStartの中身を別メソッドに移す
        private void ScriptMain() {
            // --- 対象期間のbarsを抽出して最高値、最安値のインデックスを求める
            var bars = Bars.Skip(Bars.Count - Period).ToArray();
            var highestIndex = bars.Select((bar, index) => Tuple.Create(index, bar.High)).OrderByDescending(t => t.Item2).First().Item1;
            var lowestIndex = bars.Select((bar, index) => Tuple.Create(index, bar.Low)).OrderBy(t => t.Item2).First().Item1;

            // --- フィボナッチリトレースメントの始点と終点を決める
            double y1, y2;
            DateTime t1, t2;
            if (highestIndex < lowestIndex) {
                y1 = bars[highestIndex].High;
                t1 = bars[highestIndex].OpenTime;
                y2 = bars[lowestIndex].Low;
                t2 = bars[lowestIndex].OpenTime;
            } else {
                y1 = bars[lowestIndex].Low;
                t1 = bars[lowestIndex].OpenTime;
                y2 = bars[highestIndex].High;
                t2 = bars[highestIndex].OpenTime;
            }

            // --- フィボナッチリトレースメント描いて、表示レベルを調整し、編集可能にして終了
            var ff = Chart.DrawFibonacciRetracement(Guid.NewGuid().ToString(), t1, y1, t2, y2, Color.Yellow);
            var visibleLevels = new double[] { 0, 38.2, 50.0, 61.8, 100 };
            foreach (var level in ff.FibonacciLevels) level.IsVisible = visibleLevels.Contains(level.PercentLevel);
            ff.IsInteractive = true;
            //Stop(); ここが残ってるとボタン押した途端止まってしまう。
        }

        protected override void OnTick() {
            // Put your core logic here
        }

        protected override void OnStop() {
            // Put your deinitialization logic here
        }
    }
}

 

 

動作確認だけでなくトレード練習にも

ボタンはいくつでも設置できますので、このボタンでスクリプト(なんらかの処理)を呼び出すという処理は地味に便利です。

例えば発注スクリプトや決済スクリプトを自作して、スクリプトだけでトレードが完結できるようにしておけば、簡単にバックテスト環境で売買練習ができるcBotが作れます

参考までにボタンを複数設置するときのサンプルコードを載せておきます。ポイントはボタンを設置するためのパネルを作ってボタンをのっけてからそのパネルをチャートに設置するというところです。

(直接ボタンをチャートに複数置くこともできますが、パネルに置いておいた方が後々なにかと便利です。)

ちなみに、下記コード内のOrderMethodとExitMethodに自作の発注スクリプトと決済スクリプトの中身を移すだけで、自分専用トレード練習Botが完成します。(このコードだとリアルタイム環境では動きません)

protected override void OnStart() {
    if (IsBacktesting) {
        var panel = new StackPanel {
            HorizontalAlignment = HorizontalAlignment.Left,
            VerticalAlignment = VerticalAlignment.Bottom
        };
        var button1 = new Button {
            Margin = 5,
            Text = "Order",
        };
        button1.Click += (_ => OrderMethod());
        var button2 = new Button {
            Margin = 5,
            Text = "Exit"
        };
        button2.Click += (_ => ExitMethod());
        panel.AddChild(button1);
        panel.AddChild(button2);
        Chart.AddControl(panel);
    }
}
private void OrderMethod() {
    //発注処理 例:この通貨ペア1000通貨の買い注文
    ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000);
}
private void ExitMethod() {
    //決済処理 例:全ポジション(全通貨ペア)決済
    foreach (var pos in Positions) pos.Close();
}
    

ちょっと前にcTranerというトレード練習ツールを公開しておいてなんですが、自分でスクリプト作る人ならトレード練習はもうこれだけで十分な気もしてきました。

あ、自分でスクリプトは作らないけどバックテスト環境でトレード練習したいという方は、ぜひcTranerをご利用ください。


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2026 ajinori